在下面的程序中,如果我使用该行作为否定的扫描集,即使输入的是多行(以ENTER或换行结尾),即使换行在否定列表中,它也可以正常工作。
但是,如果我改用该行作为scanset并输入单词“ aegis”(或与此有关的任何带有辅音的单词),则会输出垃圾字符。与第一种情况类似,如果我输入此单词,至少不应输出“ ae”吗?请解释scanset的行为以及scanf()否定的scanset的行为。
#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()
和family的返回值。if (scanf(some_format, var1, var2, ...) != ExpectedConversionCount) {
Fail();
}
2)
scanf("%[^\n]",str);
读取行失败3件事:没有输入限制,如果该行仅由'\n'
组成,则无法读取任何内容。如果不检查返回值,则不会检测到EOF
。3)使用
fgets()
代替scanf()
进行用户输入。