1

我已经阅读了很多关于getchar()其行为的问题,但我仍然不明白这个简单的代码..

    while (scanf("%d", &z) != 1)
  {
    while (getchar() != '\n');
    printf ("Try again: ");}

这段代码是为了验证字符。从我从这段代码中推断出来的是,如果我输入

Stackoverflow

然后整行被推入缓冲区,换行符 '\n' 也.. 然后getchar()从缓冲区中读取每个字符并返回一个整数,清理缓冲区.. 在这种情况下,while 循环应该循环 12 次( Stackoverflow 中的字符),直到它到达 '\n' 字符.. 但实际上它只循环一次,输出是

Try again:

意味着它超出了循环并scanf再次要求..它违背了我对循环的理解..也许我误解了循环..还有一个问题,如果getchar()返回整数,那么它如何与'\ n'之类的字符进行比较?

4

1 回答 1

5

重新格式化代码以帮助我解释:

while (scanf("%d", &z) < 1) {
  int c; // for getchar()'s return value
  while ((c = getchar()) != EOF && c != '\n')
    ;
  printf ("Try again: ");
}

请注意,scanf返回它成功读取的项目数。(我改变了外部while条件。)

编辑getchar():检查EOF非常重要。否则循环可能永远旋转。

内部while后跟一个分号。这意味着它没有循环体,即除了评估它的条件之外什么都不做,直到所述条件为假。

但是代码有什么作用?

说我输入Stackoverflowscanf查看%d它的格式字符串,查找一个整数(任意数量的数字,可选地以符号作为前缀),找不到任何类型,并返回失败(即0)而不更改z.

执行进入循环,循环getchar调用 where 直到找到换行符;这将读取并丢弃所有错误输入。程序打印Try again:(没有换行符),然后外循环再次评估它的条件,尝试读取一个整数。

冲洗并重复,直到输入一个整数,此时将其scanf塞入z并完成循环。

那么将getchar()(int) 与'\n'( char int) 进行比较呢?

在 C 中,char只是一个较小的int. C 没有与表示它们的整数概念分开的字符概念。 '\n'是 a int,而不是 a char,所以这里没有问题。(这是出于历史原因 - 与 K&R C 有关。)

于 2013-04-27T06:25:33.247 回答