2016-11-11 60 views
4

我只是问在这段代码中getchar做了什么,它是如何工作的?我不明白为什么getchar会影响代码,对我来说,好像它只是获取值,但没有任何值正在完成。C代码,scanf和getchar

int c=0; 
while (c>=0) 
{ 
    scanf("%d", &c); 
    getchar(); 
} 
+2

提示:尝试使用'char'类型。在这里,这是多余的。 –

+0

完美谢谢 – james

回答

0

最有可能的代码是阅读一个整数列表,用一个新行分隔。

scanf将读取一个整数,并将其放入变量c中。

的getchar函数正在读取下一个字符(假设新行)

因为它不检查,存在一些潜在的,这不是一个新行,或scanf函数失败,因为该是什么试图读取不是一个数字。为什么getchar()可能一直使用的

3

一些可能性:如果它这样做忽略空格)

1)(与%c扫描字符时通常使用的,这不是在这里需要的,因为%d忽略空格呢。

2)另一种可能性是,这个循环中,一些进一步的扫描完成,其中最后调用剩下最后\nscanf()可能是一个问题。因此,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?

+0

好点和结论。 – chux

1

在此代码,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); 
0

getchar();仅仅是阅读和数量后消费性格,无论是空格,逗号,新线路或其它整数或任何其他的开始。

IMO,这不是健壮的代码。好的代码将1)至少测试scanf()的结果和2)测试或限制以下字符的消耗,以防止“吃”下面数字的可能符号。记住代码无法控制用户输入的内容,但必须处理输入的内容。

v space 
"123 456" 

    v comma 
"123,456" 

    v negative sign 
"123-456"