在下面的程序中,如果我使用该行作为否定的扫描集,即使输入的是多行(以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()进行用户输入。

10-04 15:08
查看更多