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

时间:2014-12-07 13:14:37

标签: c io getchar

这是我previous问题的后续问题。已经提出了类似的问题(question)。但是我从那个答案中得不到我想知道的东西。

从上一个问题我开始知道,如果我键入了很多字符,那么它们就不能用于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,Enter}。我期望的输出是:Number of chars are 6。但我得到的输出是Number of chars are 4

answer解释了当我们输入1,2,3,^Z时,^Z行为如Enter和1,2,3被发送到getchar()s。上面编写的代码的while循环运行三次。 {(1}}没有给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次,因此变量^Z应该变为nc

  
      
  • 为什么我将6作为4的值,而不是nc
  •   

2 个答案:

答案 0 :(得分: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输入视为&#34;将^Z之前的输入发送到stdin,丢弃该行上的剩余输入(包括行尾分隔符),然后发送{ {1}}&#34;除非它位于一行的开头,在这种情况下它会发送^Z而不是EOF

^Z

此外,Windows始终等待Enter / Return键,但123^Z45 Character read: 31 Character read: 32 Character read: 33 Character read: 1a ^Z12345 Number of chars: 4 ^C等极少数键序列除外。

答案 1 :(得分:1)

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

另请参阅_set_fmode,但是,我不确定是否会立即更改行为或是否必须关闭/重新打开文件。不确定是否可以关闭/重新打开stdin(不再进行太多的控制台编程)。