【问题标题】:ch2=getchar() doesn't work after last input loop while((ch=getchar())!=EOF)ch2=getchar() 在最后一个输入循环后不起作用 while((ch=getchar())!=EOF)
【发布时间】:2016-07-30 10:07:41
【问题描述】:
#include <stdio.h>
int main(){
    char ch;
    while((ch=getchar())!=EOF){
       putchar(ch);
    }
    char ch2 = 'A';
    printf("ch2=======>%c\n",ch2);
    ch2 = getchar();
    printf("ch2=======>%d\n",ch2);
    return 0;
}

我不明白为什么它会跳过ch2=getchar() 输入,然后我得到 ch2 == -1,它是 EOF 的值。我试图通过在ch2=getchar() 之前添加另一个getchar() 来解决这个问题,但我仍然得到 ch2 == -1。为什么会这样以及如何解决?感谢您的帮助。

我使用的是 MacOS。

【问题讨论】:

  • 在这个例子中你为什么还要使用 EOF?据我所知,这段代码与文件无关。
  • 最后一个输入是EOF,所以它不会进入循环;
  • 一旦您到达输入的末尾,任何进一步的读取尝试仍然会到达输入的末尾。
  • 另外,不要将getchar() 的返回值存储在char 中。它返回 int 是有原因的。
  • @melpomene 哦,谢谢。那么这是否意味着标准输入流在我输入 EOF 时永久停止?

标签: c


【解决方案1】:

编译时,始终启用所有警告,然后修复这些警告

我使用了你的这个版本的代码,它可以干净地编译:

#include <stdio.h>
int main(){
    int ch;
    while((ch=getchar())!=EOF){
       putchar(ch);
    }
    int ch2 = 'A';
    printf("ch2=======>%c\n",ch2);
    ch2 = getchar();
    printf("ch2=======>%d\n",ch2);
    return 0;
}

然后输入:

ddd<ctrl-d>ccc<cr>

这是预期(和实际)的结果:

ddd
ddd
ch2=======>A
ccc
ch2=======>99

注意事项:

1) 在输入 &lt;cr&gt;&lt;ctrl-d&gt; 之前,getchar() 不会返回

2) 所有输入的字符都由终端驱动程序(不是程序)回显

3) 输入缓冲区中仍有 2 个cs 和一个&lt;cr&gt; 未被消耗

【讨论】:

  • 您使用的是 Linux 还是 MacOS,因为我注意到您输入了 Ctrl+D。我在 Mac 上复制了您的代码并运行它。它不起作用。但我和你的代码都可以在 Windows 上运行良好。
  • 我打赌他正在使用 Linux。
【解决方案2】:

没有什么令人惊讶的。你的循环

while((ch=getchar())!=EOF){
       putchar(ch);
}

完全耗尽stdin。然后printf()stdout添加了一些数据,但是stdin还是空的,所以后面的getchar()返回EOF

【讨论】:

  • 是的,好吧,但是如果stdin是从键盘输入的(和往常一样),即使在按了Ctrl-Z之后,通常也可以继续输入,而且stdin并没有真正用尽。
  • @RudyVelthuis 上次循环迭代和ch2 = getchar(); 之间的时间片非常小,以至于用户肯定无法提供新的键盘输入,并且 STDIN 仍然可能被认为是空的。
  • getchar() 是,AFAIK,缓冲,所以程序将等待输入,直到有人按下返回(或任何键被调用)。时间片应该是无关紧要的。
  • 好的,我在 Windows 和 Mac 上都试过了。 Mac 并没有真正等待,而是立即返回 -1 (EOF)。这符合你写的。但在 Windows 上,getchar() 会一直等到输入第一个 '\n'。嗯...不一致。我不知道哪个实际上是正确的。
  • @RudyVelthuis 是的。我刚刚在 Windows 上尝试过,我的代码运行良好。它等待getchar() 输入,但在 Mac 上它只返回 -1。大声笑,我很困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多