user-0 提问: 这个程序为什么不能显示统计制表符、换行符、空格个数？

回复:
user: user-1
content: 引用 8 楼 asdasewqs 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 按Enter、Ctrl+Z、Enter退出。 感谢！还2个问题，EOF(end of file)是不是字符串的结束符\0？ 2是这个程序： 输入复制到输出，将相连的多个空格用一个空格代替 #include <stdio.h> int main(void) {int c; int inspace; inspace=0; while((c=getchar())!=EOF) {if (c==' '){ if (inspace==0){ inspace==1; putchar(c); }} if (c!=' '){ inspace=0; putchar(c);}} return 0; } 输入复制到输出是实现了，但是我连敲3个空格回车后还是3空格，怎么实现3空格变一个空格？？谢谢了。 [/quote] 参考《编译原理》中的词法分析和有限状态自动机。

user: user-2
content: EOF=-1

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:按Enter、Ctrl+Z、Enter退出。 感谢！还2个问题，EOF(end of file)是不是字符串的结束符\0？ 2是这个程序： 输入复制到输出，将相连的多个空格用一个空格代替 #include <stdio.h> int main(void) {int c; int inspace; inspace=0; while((c=getchar())!=EOF) {if (c==' '){ if (inspace==0){ inspace==1; putchar(c); }} if (c!=' '){ inspace=0; putchar(c);}} return 0; } 输入复制到输出是实现了，但是我连敲3个空格回车后还是3空格，怎么实现3空格变一个空格？？谢谢了。

user: user-1
content: 按Enter、Ctrl+Z、Enter退出。

user: user-3
content: 呆B,EOF是那个字符????????????? 死循环知道不???????????  #include <stdio.h> int main(void) { int tabs,newlines,blanks; int c;                                  /*自己比较一下*/ int lastchar=0; blanks=0; tabs=0; newlines=0; while(1)                  /*自己比较一下*/ {c=getchar(); if(c==' ') ++blanks; if(c=='\t') ++tabs; if(c=='\n') ++newlines; if(c=='q'){                     /*自己比较一下,遇到q退出*/ if (lastchar!='\n'){ ++newlines;} break;}                    /*自己比较一下*/ lastchar=c; } printf("%d%d%d\n",blanks,tabs,newlines); return 0; }

user: user-1
content: 引用 3 楼 asdasewqs 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 仅供参考//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }  我写的程序问题出在哪呢？？[/quote] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 2 楼 u010486937 的回复:tab键不是让你输入‘\t’的，而是计算机把tab转换成'\t'的，简单修改的一下 我是用vc++6.0，改成你写的还是不能显示次数。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:仅供参考//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }  我写的程序问题出在哪呢？？

user: user-4
content: tab键不是让你输入‘\t’的，而是计算机把tab转换成'\t'的，简单修改的一下

user: user-1
content: 仅供参考//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }