为什么getchar()函数不循环?

时间:2013-04-27 06:08:25

标签: c while-loop getchar

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

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

这段代码用于验证字符..我从这段代码推断的是,如果我输入

Stackoverflow

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

Try again:

意味着它的循环再次要求scanf ..这违背了我对循环的理解..也许我误解了循环..另外一个问题,如果getchar()返回整数那么它是怎么回事可以与'\ n'等字符进行比较?

1 个答案:

答案 0 :(得分: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直到找到换行符;这会读取并丢弃所有错误输入。程序打印Try again:(没有换行符),然后外部循环再次计算其条件,尝试读取整数。

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

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

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