这是系统问题还是程序问题么

C语言 码拜 8年前 (2016-04-25) 873次浏览
自学C语言中,袭击买了本C Primer第五版
然后第七章习题第一题要求程序读取输入的字符,知道遇到”#”为止,然后统计输入的空格,换行符以及所以字符的数字

#include<stdio.h>
#define Space " "
#define Eof "#"
#define LineBreak "\n"
int main(void)
{
  int CountSpace = 0;
  int CountLineBreak = 0;
  int Counts = 0;
  char ch;
  ch = getchar();
  while(ch != Eof)    // <--问题在这里
  {
    switch(ch)
    {
      case Space:
        ++CountSpace;
        break;
      case LineBreak:
        ++CountLineBreak;
        break;
      default:
        ++Counts;
     }
    ch = getchar();
  }
  
  printf("%d Space,%d LineBreak,%d chars",CountSpace,CountLineBreak,Counts+CountSpace+CountLineBreak);
 return 0;
}

程序编译后,例如输入
123   (前面3空格)\n\n\n(三回车)#1234\n(这里也是回车)
这样的输入,本人以为当本人输入到#的时候程序就会停止接受输入,但事实上输入#后还会继续要求输入,除非你再次输入回车,最后程序统计的结果是
无论#后面输入了多少,都只统计到#为止,从统计的结果来看程序没问题
但本人想知道为什么本人输入了”#”程序为什么不立刻停止接受输入,这是本人代码有问题还是说牵扯到系统(本人的系统是ubuntukylin编译器是GCC4.8.2)

解决方案

40

原因是这是系统的缓冲机制,只有缓冲区满了或接受到回车字符了,getchar()函数才能返回。
getchar()是从缓冲区中一个一个字符读取
楼上说的getch()是windows下独有函数,它不使用缓冲机制,所以只要有字符输入函数就可以返回。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明这是系统问题还是程序问题么
喜欢 (0)
[1034331897@qq.com]
分享 (0)