对于scanf(),为什么否定scanset"%[^ \ n]"显示" \ n"的正确输出,但不显示扫描集"%[aeiou]" for" aegis"?

时间:2015-10-24 16:47:34

标签: c++ c newline scanf format-specifiers

在下面的程序中,如果我使用行作为否定扫描集,如果我输入一个多字行(以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);
}

1 个答案:

答案 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()进行用户输入。