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

如何修改C语言程序实现指定行数输入下的单词统计输出?

解决C语言统计单词并输出指定格式的问题

需求说明

需要修改程序逻辑:先输入行数,再读取对应行数的内容,统计所有单词数量后,输出对应数量的Word x:格式内容(与原程序输出一致)。

原代码问题分析

你尝试的代码存在以下几个关键问题:

  • 输入缓冲区残留换行符:scanf("%d", &cislo)读取行数后,输入流中会留下换行符,后续fgets会先读取这个空行,导致第一行内容处理错误。
  • 循环逻辑混乱:内层while(fgets)无终止条件,会持续读取输入;外层循环的cislo2变量未递增,无法控制读取指定行数。
  • 变量作用域错误:j定义在fgets循环内部,外层的i += j会访问未初始化的变量,行为未定义。

修正后的代码

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

int main()
{
    char pole[100];
    int total_words = 0;
    int line_count;
    int current_line = 0;
    char *token;
    const char *delimiters = " \r\n";

    // 读取行数,并处理输入缓冲区残留的换行符
    scanf("%d", &line_count);
    getchar();

    while (current_line < line_count) {
        if (fgets(pole, 100, stdin) == NULL) {
            // 读取失败或提前到达输入结尾,终止循环
            break;
        }

        int line_words = 0;
        token = strtok(pole, delimiters);
        while (token != NULL) {
            // strtok会自动跳过连续分隔符,返回的token不会是空字符串
            line_words++;
            token = strtok(NULL, delimiters);
        }

        total_words += line_words;
        current_line++;
    }

    // 输出结果
    for (int x = 0; x < total_words; x++) {
        printf("Word %d: \n", x);
    }

    return 0;
}

修正要点说明

  1. 处理输入缓冲区:用getchar()读取scanf遗留的换行符,确保fgets能正确读取后续的行内容。
  2. 规范循环逻辑:外层循环通过current_line计数,读取指定行数后自动终止;每行处理逻辑独立,避免嵌套无限循环。
  3. 调整变量作用域:将line_words定义在每行处理的范围内,确保每次处理新行时重新初始化,正确累加到总单词数。
  4. 优化判断逻辑:strtok会自动跳过连续分隔符,返回的token不会是空字符串,因此可以去掉strlen(token) > 0的冗余判断。

内容的提问来源于stack exchange,提问作者Mkkl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:45:54