如何统计数组中首个单词的出现次数?(C语言一维数组,禁用strtok)
问题分析与修复
原代码的核心错误
- 统计逻辑完全错误:原内层循环试图用
d = k匹配distArr[d],但distArr长度是首个单词的长度,当k大于等于该长度时循环根本不会执行;且逐个字符匹配就累加count的逻辑,统计的是匹配字符数而非单词出现次数。 - 未处理单词匹配后的跳转:匹配完一个单词后,未跳过当前单词的剩余字符,会导致重复检查同一单词的后续字符。
- 重复调用
strlen:循环中反复调用strlen会频繁计算字符串长度,降低效率。
修复后的代码
#include <stdio.h> #include <string.h> int main(void) { char finalArr[100]; char src; int i = 0; printf("Enter a string: "); // 读取输入字符串 while ((src = getchar()) != '\n' && i < 99) { finalArr[i] = src; i++; } finalArr[i] = '\0'; printf("Input string: %s\n", finalArr); // 提取首个单词到distArr char distArr[100]; int j = 0; // 遍历到空格或字符串结尾,提取首个单词 while (j < strlen(finalArr) && finalArr[j] != ' ') { distArr[j] = finalArr[j]; j++; } distArr[j] = '\0'; int len_dist = strlen(distArr); // 如果首个单词为空(输入全是空格),直接输出0 if (len_dist == 0) { printf("Count: 0\n"); return 0; } printf("First word: %s\n", distArr); // 统计首个单词的出现次数 int count = 0; int len_final = strlen(finalArr); int k = 0; while (k < len_final) { // 跳过前面的空格 while (k < len_final && finalArr[k] == ' ') { k++; } // 到达字符串结尾,退出循环 if (k >= len_final) { break; } // 检查当前位置是否匹配首个单词 int match = 1; for (int d = 0; d < len_dist; d++) { // 如果字符不匹配,或者当前位置已经到字符串结尾,标记不匹配 if (k + d >= len_final || finalArr[k + d] != distArr[d]) { match = 0; break; } } // 如果匹配成功,计数加1,并且跳过当前单词的长度 if (match) { count++; k += len_dist; } else { // 不匹配的话,只跳过当前字符,继续检查下一个位置 k++; } } printf("Count: %d\n", count); return 0; }
关键修复点说明
- 首个单词提取优化:改用
while循环更清晰,同时处理输入只有单个单词的情况。 - 提前存储字符串长度:将
strlen结果存入变量len_final和len_dist,避免循环内重复计算。 - 正确的匹配逻辑:
- 先跳过当前位置的所有空格,定位单词起始点。
- 从起始点开始逐个字符比对首个单词,只有全匹配才算一次有效出现。
- 匹配成功后直接跳过整个单词长度,避免重复检查;匹配失败则移动一个字符继续寻找。
- 边界处理:增加空单词(输入全是空格)的判断,避免无效计算。
测试输入qwe qwe qwe时,输出结果为3,符合预期。
内容的提问来源于stack exchange,提问作者eliazz
相关产品推荐
相关产品推荐

