You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:05:10