В следующей программе, если я использую строку для отмененного набора сканирования, она будет работать нормально, если я введу строку из нескольких слов (оканчивающуюся на ENTER или новую строку), даже если новая строка находится в списке с отрицанием.
Но если я вместо этого использую строку для набора сканирования и ввожу слово «эгида» (или любое слово с согласными в этом отношении), то выводятся ненужные символы. По аналогии с первым случаем, если я введу это слово, по крайней мере, «ae» не должно быть выведено? Пожалуйста, объясните это поведение набора сканирования и отрицательного набора для зсапЕ ().
#include <stdio.h>
int main ()
{
char str[30];
printf("Enter the string\n");
//scanf("%[^\n]",str);
//scanf("%[aeiou]",str);
printf("%s",str);
}
Это потому, что код ошибочно не проверяет возвращаемое значение scanf()
printf("Enter the string\n");
scanf("%[^\n]",str);
scanf("%[aeiou]",str); // check result before using `str`
printf("%s",str);
С scanf("%[^\n]",str);
и ввод, как "123\n"
, str
получить значения "123"
а также '\n'
остается в stdin
. Затем с scanf("%[aeiou]",str);
и ввод, как "aegis\n"
первая строка '\n'
блоки, сохраняющие что-либо как '\n'
не гласная, ничего не сохраняется в str
и так как код не проверял возвращаемое значение scanf()
, не понял, что str
может быть недействительным
1) Всегда проверяйте возвращаемое значение scanf()
и семья.
if (scanf(some_format, var1, var2, ...) != ExpectedConversionCount) {
Fail();
}
2) scanf("%[^\n]",str);
не может прочитать строку 3 вещи: нет предела ввода, не может прочитать что-либо, если строка состоит только из '\n'
, Без проверки возвращаемого значения, EOF
не обнаружен
3) Использование fgets()
вместо scanf()
для ввода пользователя.
Других решений пока нет …