提问者:小点点

理解C语言字符计数程序中的getchar()


这是我上一个问题的后续问题。已经有一个类似的问题(问题)。但我从这个答案中没有得到我想知道的东西。

从上一个问题中,我知道如果我键入很多字符,那么它们将无法用于 getchar(),直到我按 Enter 键。因此,在我按 Enter 键的那一刻,所有字符都将可用于 getchar()。现在考虑以下字符计数程序:

#include<stdio.h>
main()
{
  long nc;
  nc=0;
  while(getchar()!=EOF)
  ++nc;
  printf("    Number of chars are %ld ",nc);
}

如果我按照以下顺序从命令行输入字符:{1,2,3,^Z,4,5,回车},然后在下一行{^Z,回车}。我期望的输出是:字符数为6。但是我得到的输出是字符数为4

这个答案解释了当我们input1,2,3,^Z时,那么^Z的行为就像< code>Enter并且1,2,3被发送到getchar()s .上面写的代码的while循环运行三次。^Z没有给getchar(),所以程序还没有终止。我的输入是{1,2,3,^Z,4,5,Enter}.在^Z之后,我按了4,5,然后回车。现在,当我按Enter键时,字符4,5和Enter,应该被赋予getchar()s,而while循环应该执行三次以上。然后在最后一行输入{^Z,Enter},因为^Z后面没有文本,它被认为是一个字符,当我按Enter时,这个^Z被作为getchar()的输入,while循环终止。在所有这些中,while循环已经执行了6次,所以变量< code>nc应该变成< code>6。

    < li >为什么< code>nc的值是< code>4,而不是< code>6。

共2个答案

匿名用户

添加一些输出将帮助您:

#include <stdio.h>
int
main (void)
{
  int c, nc = 0;
  while ((c = getchar ()) != EOF)
    {
      ++nc;
      printf ("Character read: %02x\n", (unsigned) c);
    }
  printf ("Number of chars: %d\n", nc);
}

Windows控制台将^Z输入视为“将^Z之前的输入发送到stdin,丢弃行上的剩余输入(包括行尾分隔符),并发送^ Z>”,除非它位于行的开头,在这种情况下,它将发送EOF而不是^2

123^Z45
Character read: 31
Character read: 32
Character read: 33
Character read: 1a
^Z12345
Number of chars: 4

此外,Windows始终等待Enter键/Return键,只有极少数键序列例外,如^C^{Break}

匿名用户

^Z 或 Ctrl-Z 表示文本文件(旧 MS-DOS)的文件结尾。getchar() 等价于 fgetc(stdin),通常是一个宏。“fgetc 返回读取为 int 的字符或返回 EOF 以指示错误或文件结束。”

但是,我不确定这是否会立即改变行为,或者你是否必须关闭/重新打开文件。也不确定是否可以关闭/重新打开stdin(不要再做太多的控制台编程)。