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

C语言单词计数程序问题求助:计数错误与循环异常

修复C语言单词计数程序的两个问题

原代码的核心问题

  • 计数器j未在每次循环开始时重置,导致后续计数累加之前的结果
  • 单词判断逻辑错误:fgets会读取输入末尾的换行符\n,单个单词场景下str[i+1]为\n而非\0,无法触发计数;同时逻辑仅统计单词的最后一个字母,未处理单词开头的识别,也不支持连续空格的情况
  • 输入缓冲区处理不完善,导致后续fgets读取残留字符,引发输入混乱

修改后的代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
    char str[100];
    int word_count;
    char choice;
    
    do {
        word_count = 0; // 每次循环重置单词计数器
        printf("Enter String: ");
        fgets(str, sizeof(str), stdin);

        // 移除fgets读入的换行符,避免干扰判断
        size_t len = strlen(str);
        if (len > 0 && str[len-1] == '\n') {
            str[len-1] = '\0';
            len--;
        }

        int in_word = 0; // 标记当前是否处于单词区间内
        for (size_t i = 0; i <= len; i++) {
            // 判断当前字符是否为字母(使用标准库函数更可靠)
            if (isalpha((unsigned char)str[i])) {
                if (!in_word) {
                    // 从非单词状态切换到单词状态,计数+1
                    word_count++;
                    in_word = 1;
                }
            } else {
                // 非字母字符,切换为非单词状态
                in_word = 0;
            }
        }

        printf("Word count: %d\n", word_count);

        printf("Try again?(Y/N): ");
        // 清空输入缓冲区,避免残留字符影响下一次输入
        while ((getchar()) != '\n');
        scanf("%c", &choice);
        // 再次清空缓冲区,处理scanf后剩余的换行符
        while ((getchar()) != '\n');
    } while (choice == 'y' || choice == 'Y');

    return 0;  
}

关键修改说明

  1. 计数器重置:每次进入循环时将word_count设为0,确保每次输入的计数独立,不会累加之前的结果
  2. 单词判断逻辑优化:使用状态标记法,当从非字母字符切换到字母字符时,判定为新单词的开始,计数加1,这种方式能正确处理单个单词、连续空格、带数字/特殊字符的场景
  3. 换行符处理:将fgets读入的换行符替换为字符串结束符\0,避免干扰单词末尾的判断
  4. 输入缓冲区完善:在scanf前后清空缓冲区,确保下一次fgets能读取到用户的新输入,解决循环时的输入混乱问题

测试运行示例

Enter String: i
Word count: 1
Try again?(Y/N): Y
Enter String: i have 3 Apples
Word count: 3
Try again?(Y/N): Y
Enter String: hello WORLD
Word count: 2
Try again?(Y/N): N

内容的提问来源于stack exchange,提问作者Roshina De Jesus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:03:38