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; }
关键修改说明
- 计数器重置:每次进入循环时将
word_count设为0,确保每次输入的计数独立,不会累加之前的结果 - 单词判断逻辑优化:使用状态标记法,当从非字母字符切换到字母字符时,判定为新单词的开始,计数加1,这种方式能正确处理单个单词、连续空格、带数字/特殊字符的场景
- 换行符处理:将
fgets读入的换行符替换为字符串结束符\0,避免干扰单词末尾的判断 - 输入缓冲区完善:在
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
相关产品推荐
相关产品推荐

