C语言统计字符串每个单词长度,代码运行无输出如何解决?
问题原因
- 循环变量
i的增量逻辑错误:单轮循环内最多会对i执行3次自增操作,导致字符串遍历跳步,无法正常读取每个字符,甚至可能出现数组越界。 - 单词长度存储逻辑错误:当前逻辑是每处理一个字符就将
wordlen清零并存入数组,且pos赋值逻辑错误,没有按照单词计数的顺序存入word数组的对应下标,最终word数组前几位始终为初始值0,打印循环直接触发break条件,所以没有任何输出。 - 代码存在其他潜在问题:未定义常量
N、未引入必要头文件、使用已被C标准废弃的不安全函数gets。
修改方案
修改后可正常运行的完整代码如下:
#include <stdio.h> #include <string.h> #include <ctype.h> // 定义输入字符串的最大长度 #define MAX_STR_LEN 100 int main() { char str[MAX_STR_LEN + 1]; int i = 0; int pos = 0; int wordlen = 0; int word[60] = {0}; printf("Please enter the string of characters: "); // 用安全的fgets替代废弃的gets fgets(str, sizeof(str), stdin); // 清除fgets读取到的末尾换行符 str[strcspn(str, "\n")] = '\0'; while(i < strlen(str)) { // 读取到字母时累计当前单词长度 if(isalpha(str[i])) { wordlen++; i++; } // 读取到非字母时,判断是否需要存储已读取完成的单词 else { if(wordlen > 0) { word[pos] = wordlen; pos++; wordlen = 0; } i++; } } // 补充处理字符串末尾的最后一个单词(如果结尾是字母的话) if(wordlen > 0) { word[pos] = wordlen; pos++; } // 按实际单词数量输出长度 for(i = 0; i < pos; i++) { printf("%d ", word[i]); } return 0; }
核心修改说明
- 修正了
i的增量逻辑:每轮循环仅对i自增一次,保证遍历所有字符。 - 重写了单词存储逻辑:只有遇到非字母且当前单词长度大于0时,才将长度存入数组,计数下标
pos加1;遍历结束后额外判断是否有末尾单词未存入。 - 补充了必要头文件、定义了字符串长度常量,替换了不安全的输入函数,处理了读取时的换行符问题。
- 打印逻辑直接用实际的单词计数
pos作为遍历上限,无需额外判断0值即可避免多余输出。
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

