K&R习题程序空格、制表符计数异常及EOF使用问题求助
问题解答:K&R习题统计字符与ChromeOS Linux环境问题
一、代码统计错误的修复
你的代码核心问题是switch语句的case未添加break,导致代码贯穿执行:
- 匹配到
'\n'时,执行lines++后会继续执行blanks++和tabs++ - 匹配到
' '时,执行blanks++后会继续执行tabs++
这直接导致空格、制表符计数严重失真,甚至出现异常大的数值。
修正后的代码:
#include <stdio.h> int main(void) { int input = 0; int blanks = 0; int tabs = 0; int lines = 0; while((input = getchar()) != '*') { switch(input) { case '\n': lines++; break; case ' ': blanks++; break; case '\t': tabs++; break; default: break; } } printf("BLANKS:%i TABS:%i LINES:%i\n", blanks, tabs, lines); return 0; }
修正后,输入你提供的示例内容会得到正确统计:换行1次、空格3个、制表符2个,输出为BLANKS:3 TABS:2 LINES:1。
二、ChromeOS Linux环境下EOF与Ctrl+Z的问题
EOF终止程序的正确操作:
Linux环境下发送EOF的快捷键是Ctrl+D,而非Windows的Ctrl+Z。你之前用Ctrl+Z只是将程序暂停并放到后台,并未终止,因此程序不会执行后续的统计输出。改用Ctrl+D发送EOF,程序会正常结束循环并执行printf代码。恢复被Ctrl+Z暂停的程序:
- 输入
fg命令,可将后台暂停的程序调回前台继续运行 - 输入
bg命令,可让程序在后台继续运行 - 输入
jobs命令,可查看当前后台的程序列表
内容的提问来源于stack exchange,提问作者gusfring alves
相关产品推荐
相关产品推荐

