C语言字符、单词、行数统计程序错误排查求助
C语言字符、单词、换行符统计程序的问题排查
我是一名编程初学者,编写了一段用于统计字符、单词和换行符数量的C语言程序,但运行结果和预期不符。
程序代码如下:
#include <stdio.h> int main() { int nw, nl, nc, c; nw = nc = nl = 0; for (c = getchar(); c != EOF; c = getchar()) { if (c == '\n') ++nl; if (c != '\n' || c != '\t' || c != ' ') { for (c = getchar(); c == '\n' || c == '\t' || c == ' '; c = getchar()) { ++nc; } ++nw; ++nc; if (c == '\n') ++nl; } else ++nc; } printf("%d %d %d", nc, nw, nl); return 0; }
输入内容:
smith book c c++ bug
程序输出为9 0 13,与预期不符,以下是程序存在的核心问题:
1. 逻辑判断条件完全错误
代码中if (c != '\n' || c != '\t' || c != ' ')这个表达式永远为真——一个字符不可能同时等于\n、\t和空格,因此不管输入什么字符,都会进入这个分支,永远不会执行else分支的字符计数逻辑,直接导致整个统计逻辑混乱。
正确的判断应该是逻辑与(&&):if (c != '\n' && c != '\t' && c != ' '),用来识别当前字符为非空白字符。
2. 嵌套循环错误读取字符,丢失大量计数
内层for循环for (c = getchar(); c == '\n' || c == '\t' || c == ' '; c = getchar())存在多个问题:
- 外层循环读取到非空白字符后,内层循环立刻读取下一个字符,导致第一个非空白字符完全没被计入字符数
nc; - 内层循环仅对空白字符计数,退出后只给
nc加1,丢失了中间读取的大量字符; - 若内层循环读取到
\n,会先计入nc,之后又在if (c == '\n')中重复给nl加1,导致换行符重复计数。
3. 单词统计逻辑不符合规则
正确的单词统计逻辑是从空白字符切换到非空白字符时,才算一个新单词,但当前代码遇到非空白字符就直接给nw加1,完全没有状态判断,导致单词数统计彻底错误(比如示例中nw=0就是因为逻辑混乱,计数触发条件完全失效)。
内容的提问来源于stack exchange,提问作者Unknown69_
相关产品推荐
相关产品推荐

