【问题标题】:why the getchar() function does not loop?为什么 getchar() 函数不循环?
【发布时间】:2013-04-27 06:08:25
【问题描述】:

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

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

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

Stackoverflow

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

Try again:

意味着它的循环外并再次要求scanf..这违背了我对循环的理解..也许我误解了循环..还有一个问题,如果getchar()返回整数,那么如何将它与像'\n'这样的字符?

【问题讨论】:

    标签: c while-loop getchar


    【解决方案1】:

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

    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&R C 有关。)

    【讨论】:

    • 使用循环读取换行符,您还需要考虑获得 EOF 的可能性——因为如果在遇到换行符之前遇到 EOF,您的循环将运行很长时间。您应该使用:int c; while ((c = getchar()) != EOF &amp;&amp; c != '\n') ;(最后一个分号将单独位于一行,但您不能在评论中显示)。如果您愿意,可以在 EOF 之前测试换行符;不过,您确实需要同时检查两者。请记住,getchar() 返回的是 int,而不是 char
    • @JonathanLeffler 谢谢。我将编辑 EOF 的内容。(我知道那些东西。我发誓。我只是忘记了。)
    • 谢谢.. 我不相信我没有看到那个分号.. 道德,“不要把 C 看低,一个分号会毁了你的周末”。
    • 关于你的最后一段,在 C 中,'\n'int,而不是 char。但很好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多