如何修改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; }
修正要点说明
- 处理输入缓冲区:用
getchar()读取scanf遗留的换行符,确保fgets能正确读取后续的行内容。 - 规范循环逻辑:外层循环通过
current_line计数,读取指定行数后自动终止;每行处理逻辑独立,避免嵌套无限循环。 - 调整变量作用域:将
line_words定义在每行处理的范围内,确保每次处理新行时重新初始化,正确累加到总单词数。 - 优化判断逻辑:
strtok会自动跳过连续分隔符,返回的token不会是空字符串,因此可以去掉strlen(token) > 0的冗余判断。
内容的提问来源于stack exchange,提问作者Mkkl
相关产品推荐
相关产品推荐

