Моя (очень простая) программа демонстрирует странное поведение, когда мой ввод fgets превышает указанный размер буфера

Оператор $ push добавляет указанное значение в массив.

{ $push: { : , ... } }

$ push добавляет поле массива со значением как своим элементом.

Выше ответ отвечает всем требованиям, но я получил его работу, выполнив следующие

var objFriends = { fname:"fname",lname:"lname",surname:"surname" };
Friend.findOneAndUpdate(
   { _id: req.body.id }, 
   { $push: { friends: objFriends  } },
  function (error, success) {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    });
)
1
задан Joshua Robar 15 January 2019 в 23:13
поделиться

2 ответа

Вы наблюдаете поведение, потому что, если символ новой строки не записывается в ID из-за отсутствия места, он остается во входном буфере, который последующие два вызова scanf() не используют из-за того, что строка спецификатора формата не читается белым пространство.

fgets() возвращается при вводе новой строки, и новая строка записывается в буфер. В этом случае вам необходим буфер из 12 символов - для размещения новой строки и нулевого терминатора. Хорошей идеей является также инициализация буфера нулями.

char ID[11] = {0} ;

После fgets() вам может потребоваться заменить символ новой строки на ноль.

Чтобы заменить новую строку на nul или отбросить данные входного буфера, где новая строка остается:

char* end = strrchr( ID, `\n` ) ;
if( end != NULL) 
{ 
    *end = `\0` 
}
else
{
    char c ;
    do
    {
        c = getchar() ;
    } while( c != '\n' && c != EOF ) ;
}
0
ответ дан Clifford 15 January 2019 в 23:13
поделиться

Причина в том, что остальная часть строки не извлекается fgets(), если она больше переданного буфера и, следовательно, остается во входном буфере вашего файлового потока stdin; впоследствии преобразования scanf() не удаются.

Вам придется обнаружить этот случай (например, проверив, является ли последний символ в вашей только что прочитанной строке не новой строкой) и очистить входной буфер до следующей новой строки, например, вызвав getchar() в цикл до новой строки (или EOF). Затем позвоните scanf().

Пример кода (непроверенный и EOF-проверка по-прежнему отсутствует):

fgets(ID, sizeof(ID), stdin);
if (ID[strlen(ID)-1] != '\n') {
    while (getchar() != '\n')
        ;
}

И не забудьте проверить возвращаемые значения ваших вызовов scanf(), чтобы увидеть, если преобразования были успешными!

0
ответ дан Ctx 15 January 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: