对于scanf(),为什么否定的扫描集"%[^n]"显示"n"的正确输出,而不是"aegis"的扫描集"%[aeiou]"?
For scanf(), why is negated scanset "%[^ ]" showing correct output for " ", but not the scanset "%[aeiou]" for "aegis"?
在下面的程序中,如果我使用行作为被否定的扫描集,如果我输入一个多单词的行(以enter或换行结束),即使换行在被否定的列表中,它也能正常工作。
但是,如果我使用这行作为扫描集并输入单词"aegis"(或任何带有辅音的单词),则输出垃圾字符。与第一种情况类似,如果我输入这个单词,难道不应该至少输出"ae"吗?请解释scanf()的扫描集和反扫描集的行为。
#include <stdio.h>
int main ()
{
char str[30];
printf("Enter the stringn");
//scanf("%[^n]",str);
//scanf("%[aeiou]",str);
printf("%s",str);
}
这是因为代码错误地不检查scanf()
的返回值
printf("Enter the stringn");
scanf("%[^n]",str);
scanf("%[aeiou]",str); // check result before using `str`
printf("%s",str);
对于scanf("%[^n]",str);
和"123n"
等输入,str
得到"123"
的值,'n'
留在stdin
中。然后使用scanf("%[aeiou]",str);
和输入"aegisn"
,第一行的'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()
的用户输入
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 为什么使用快速扫描功能时没有得到所需的输出?
- C++ 签名扫描程序输出错误
- 如何扫描 N 个字符串(使用结构),然后反向输出该字符串列表
- 对于scanf(),为什么否定的扫描集"%[^n]"显示"n"的正确输出,而不是"aegis"的扫描集"%[aeiou]"?