自学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下独有函数,它不使用缓冲机制,所以只要有字符输入函数就可以返回。
getchar()是从缓冲区中一个一个字符读取
楼上说的getch()是windows下独有函数,它不使用缓冲机制,所以只要有字符输入函数就可以返回。