在下面的程序中,如果我使用行作为否定扫描集,如果我输入一个多字行(以ENTER或换行符结尾),即使换行符在否定列表中,它也能正常工作。
但是,如果我使用该行代替扫描组并输入单词" aegis" (或任何带有辅音的词),然后输出垃圾字符。类似于第一种情况,不应该至少" ae"输入这个词后输出?请解释 scanf()的扫描集和否定扫描集的这种行为。
#include <stdio.h>
int main ()
{
char str[30];
printf("Enter the string\n");
//scanf("%[^\n]",str);
//scanf("%[aeiou]",str);
printf("%s",str);
}
答案 0 :(得分:1)
这是因为代码错误地不检查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()
进行用户输入。