我只是问在这段代码中getchar做了什么,它是如何工作的?我不明白为什么getchar会影响代码,对我来说,好像它只是获取值,但没有任何值正在完成。C代码,scanf和getchar
int c=0;
while (c>=0)
{
scanf("%d", &c);
getchar();
}
我只是问在这段代码中getchar做了什么,它是如何工作的?我不明白为什么getchar会影响代码,对我来说,好像它只是获取值,但没有任何值正在完成。C代码,scanf和getchar
int c=0;
while (c>=0)
{
scanf("%d", &c);
getchar();
}
最有可能的代码是阅读一个整数列表,用一个新行分隔。
scanf将读取一个整数,并将其放入变量c中。
的getchar函数正在读取下一个字符(假设新行)
因为它不检查,存在一些潜在的,这不是一个新行,或scanf函数失败,因为该是什么试图读取不是一个数字。为什么getchar()
可能一直使用的
一些可能性:如果它这样做忽略空格)
1)(与%c
扫描字符时通常使用的,这不是在这里需要的,因为%d
忽略空格呢。
2)另一种可能性是,后这个循环中,一些进一步的扫描完成,其中最后调用剩下最后\n
到scanf()
可能是一个问题。因此,getchar()
可能被用来忽略它。
3)如果您输入的字符不匹配%d
,scanf()
将会失败。因为您输入的字符留在输入流中,您将永远无法再次读取int
(例如,如果输入abcdddgdfg
而没有getchar()
调用)。因此,getchar()
这里将消耗所有那些 字符(每次迭代一次),最终您将能够再次读取int
(使用%d
)。
但是这一切都是真的不需要;这只是一个尝试修复scanf()
的缺陷。使用scanf()
读取输入并将其更正为确实困难。这就是为什么总是建议使用fgets()
并使用sscanf()
或使用strto*()
函数解析,如果您只是扫描整数。
参见:Why does everyone say not to use scanf? What should I use instead?
好点和结论。 – chux
在此代码,getchar
被称为用于其副作用:它从标准输入读取字符并抛出它扔掉。
可能这是从用户那里读取输入。 scanf
将消耗一个数字,但在数字未改变之后保留换行符。 getchar
消耗换行符并将其丢弃。这在此循环中不是必须的,因为下一个scanf
将跳过空白以查找下一个数字,但如果代码之后循环不期望有换行符作为第一个stdin上的东西。
此代码是越野车,因为它不检查EOF,因为当输入不一个数字或它不会做任何事情懂事时,有对数后的行更多的文字,因为它使用scanf
,这是指定的断开(例如,如果输入溢出的范围为int
,则允许崩溃程序)。更好的代码会像
char *linep = 0;
size_t asize = 0;
char *endp;
long c;
while (getline(&linep, &asize, stdin) > 0) {
errno = 0;
c = strtol(linep, &endp, 10);
if (linep == endp || *endp != '\0' || errno) {
puts("?Redo from start");
continue;
}
if (c == 0) break;
do_something_with(c);
}
free(linep);
getchar();
仅仅是阅读和数量后消费性格,无论是空格,逗号,新线路或其它整数或任何其他的开始。
IMO,这不是健壮的代码。好的代码将1)至少测试scanf()
的结果和2)测试或限制以下字符的消耗,以防止“吃”下面数字的可能符号。记住代码无法控制用户输入的内容,但必须处理输入的内容。
v space
"123 456"
v comma
"123,456"
v negative sign
"123-456"
提示:尝试使用'char'类型。在这里,这是多余的。 –
完美谢谢 – james