【问题标题】:getchar() stuck in a loop never reaching the EOFgetchar() 陷入循环,永远不会到达 EOF
【发布时间】:2018-06-26 18:24:34
【问题描述】:
#include <stdio.h>

int main() {
    int c;
    while(getchar() != EOF) {
        if (getchar() == ' ') {
            c++;
        }
        printf("%i", c);
    }
}

我意识到输入一个与您正在阅读的句子一样的句子

我\n意识到\n那个\n打字\nin\n\a\n ...

我相信这就是它的读取方式,getchar() 没有到达 EOF 以使 while 括号中的条件为假..

我的目标是制作一个接受我输入的程序.. 读它 如果有空格 它依靠计数器 到达 EOF 时 继续阅读的条件变为假 计数器值打印在屏幕上 向我展示我的整个输入中有多少个空格..

不可能吗?这就是人们为什么只使用 scanf() 的原因吗?

这是我尝试某事时得到的输出

user@user:/c# ./a.out
hello stackoverflow this does not do what i want it to
001111111222223344445666677

【问题讨论】:

  • 您知道c 没有定义值,对吧?并不是每个人都使用scanf。它通常不是读取用户输入的最佳解决方案。
  • 在 linux 终端中,CTRL-d 我相信应该在文件末尾发送。
  • 在某些 Windows 环境中,一个 CTRL-z.
  • 你为什么用getchar阅读两次?你永远不会设置cwhile((c = getchar()) != EOF) {...} 或类似的东西,因为您不会注意到所阅读的内容。
  • 到目前为止,没有人说“你错了,去检查你的代码”。

标签: c scanf eof


【解决方案1】:

您需要将getchar() 的结果放入一个变量中:

int ch;
while ((ch = getchar()) != EOF) 

您不应该再次调用getchar() 来检查它是否是一个空格,因为这将读取第二个字符,因此您将测试所有其他字符,只需比较变量即可:

    if (ch == ' ')

如果您想查看空格总数,请将printf() 放在循环的末尾,而不是在循环内部。

所以整个事情应该是这样的:

#include <stdio.h>

int main() {
    int counter=0;
    int ch;
    while((ch = getchar()) != EOF) {
        if (ch == ' ') {
            counter++;
        }
    }
    printf("%i\n", counter);
}

要从终端发送EOF,请在 Unix 上键入 Control-d,在 Windows 上键入 Control-z

【讨论】:

  • 听起来确实可行,但我原来的问题仍然存在.. EOF int 何时存储到变量 ch 中.. 它没有。文本字符串是一堆连续的字母和换行符,循环继续下去,getchar() 永远不会停止“获取字符”并且永远不会遇到 EOF..
猜你喜欢
  • 2017-08-19
  • 2012-09-14
  • 2022-12-13
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多