【问题标题】:Reading character by character from stdin until EOF in C从标准输入逐个字符读取直到 C 中的 EOF
【发布时间】:2018-04-28 16:18:11
【问题描述】:

我试图在 C 中读取一个字符串直到 EOF,但在输入下一个字符之前对每个字符做出反应。 例如: 用户输入abcd,在每个字符输入后,我将对每个字符进行一些计算。 我尝试以两种不同的方式解决这个问题:

选项 1,使用 getchar():

int d;
char c;

while ((d = getchar()) != EOF) {
    c = (char)d;
    <<< DO SOME CALCULATIONS ON 'c'>>>
    }

选项 2,使用 scanf:

char c;
while (scanf(" %c",&c) != EOF) {
    <<< DO SOME CALCULATIONS ON 'c'>>>
}

但是,这两种方法似乎都失败了。看来getchar()和scanf()是获取所有字符,直到遇到'EOF',才进入while循环。

希望对此有所帮助, 谢谢!

【问题讨论】:

  • "但在输入下一个字符之前对每个字符做出反应" 这在标准 C 中绝对不可能。您必须使用第三方或平台相关的 API。
  • @BadMiscuit 但这不会帮助我在输入下一个字符之前应用计算,或者我不明白你
  • @n.m.哇,这太令人惊讶了。我来自其他语言。
  • 什么语言?
  • 这可能会有所帮助:stackoverflow.com/a/7469410/1679849

标签: c stdin


【解决方案1】:

scanf 手册说:

"如果在第一次成功转换或 发生匹配失败。如果发生读取错误,也会返回 EOF,在这种情况下,错误指示符 设置了流(参见 ferror(3)),设置了 errno 表示错误。"

.. 在这种情况下,最好使用 do..while 方法和 scanf(如果您希望存储返回 scanf 以检查错误):

char c;

do{
  scanf("%c",&c);
  /* DO SOME CALCULATIONS ON 'c' */
}while(c != EOF);

与原始模式下的 getchar() 相同,将响应每个用户击键

使用原始模式查看此内容:https://stackoverflow.com/a/22517349/8907248

【讨论】:

  • c != EOF - 这没有意义,因为c 是一个字符。 EOF 超出 char 的范围
  • 这段代码也遇到了与 OP 试图克服的完全相同的行缓冲问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2021-06-18
相关资源
最近更新 更多