如何为字符串去重算法添加重复单词计数器?
给移除重复单词的C代码添加重复计数器解决方案
修改思路
- 新增
count数组存储每个单词的出现次数,初始值设为1(每个单词默认至少出现一次) - 在检测重复单词的逻辑中,找到重复项时递增对应单词的计数,同时标记重复的单词为空
- 最终输出时,同步打印单词及其出现次数
修改后的完整代码
#include <stdio.h> #include <string.h> int main() { char str[100], doubleArr[10][30]; int i = 0, j = 0, k = 0, l = 0, n; int count[10] = {0}; // 新增计数数组 printf("Enter the string\n"); // 替换gets为fgets避免缓冲区溢出问题 fgets(str, sizeof(str), stdin); // 去掉fgets读取的换行符 str[strcspn(str, "\n")] = '\0'; n = strlen(str); // 分割字符串到二维数组 for (i = 0; str[i] != '\0'; i++) { if (str[i] == ' ') { doubleArr[k][j] = '\0'; k++; j = 0; } else { doubleArr[k][j] = str[i]; j++; } } doubleArr[k][j] = '\0'; k++; // 修正k的值,让它等于单词总数 // 初始化计数数组,每个单词默认出现1次 for (i = 0; i < k; i++) { count[i] = 1; } // 检测重复单词并更新计数 for (i = 0; i < k; i++) { // 跳过已经被标记为重复的单词 if (doubleArr[i][0] == '\0') { continue; } for (l = i + 1; l < k; l++) { if (doubleArr[l][0] == '\0') { continue; } if (strcmp(doubleArr[i], doubleArr[l]) == 0) { count[i]++; // 标记重复单词为空 doubleArr[l][0] = '\0'; } } } // 输出结果:单词 + 出现次数 printf("去重后的单词及出现次数:\n"); for (i = 0; i < k; i++) { if (doubleArr[i][0] != '\0') { printf("%s: %d次\n", doubleArr[i], count[i]); } } return 0; }
关键修改说明
- 计数数组初始化:分割完所有单词后,给每个
count[i]赋值为1,因为每个单词初始至少出现一次。 - 重复检测逻辑优化:把内层循环的起始位置改为
i+1,避免重复比较(比如i=0和l=1,不用再比较i=1和l=0),同时跳过已经被标记为空的重复单词,避免重复计数。 - 计数更新:每当找到与
doubleArr[i]重复的单词时,直接给count[i]加1,然后标记重复单词为空。 - 输出优化:同时打印单词和对应的出现次数,结果更清晰。
- 安全性修正:替换不安全的
gets为fgets,并处理换行符,避免缓冲区溢出问题。
内容的提问来源于stack exchange,提问作者emblox
相关产品推荐
相关产品推荐

