如何在C语言中查找字符串中的重复字符?
问题:在C语言中找出字符串中的重复字符
我想要找出字符串中的重复字符并打印出来,尝试了多种方法,以下是我的C语言代码:
void char_counter(char *str){ int n = strlen(str); int i =0; int j; char substring[] ={0}; for(i; i < n; i++){ j = i + 1; if(str[i]== str[j]){ substring[i] = str[i]; printf("%c\n", substring[i]); } } }
我知道Python中实现这个功能很简单,代码如下:
def char_counter_dup(str): char_dict = {} list_of_duplicates =[] for idx, letter in enumerate(str): if letter not in char_dict: char_dict[letter] = 1 list_of_duplicates.append(letter) else: char_dict[letter] +=1 return list_of_duplicates, char_dict my_string = "acabcabcff" print("List of duplicates is: {}".format(char_counter_dup(my_string)[0]))
因为C语言没有Python里类似if not in的语法,我该如何实现?已经尝试过指针、while循环、双重索引的方法。
解决方案
你的C代码当前的问题是只检查了相邻字符,没法检测非相邻的重复字符,而且substring[] = {0}是长度为1的数组,赋值substring[i]会导致数组越界,触发未定义行为。
要实现类似Python中通过字典判断字符是否已出现的逻辑,C语言里可以用以下两种常见方法:
方法1:利用ASCII数组计数(最简单高效)
因为ASCII字符的范围是0-255,我们可以用一个大小为256的数组来记录每个字符的出现次数,这相当于Python里的字典,数组下标对应字符的ASCII值,数组值对应出现次数。
#include <stdio.h> #include <string.h> #include <stdbool.h> void find_duplicates(const char *str) { int count[256] = {0}; // 初始化所有计数为0 bool added[256] = {false}; // 标记字符是否已加入重复列表 int len = strlen(str); // 第一步:统计每个字符的出现次数 for (int i = 0; i < len; i++) { count[(unsigned char)str[i]]++; } // 第二步:输出所有出现次数>1的字符,避免重复输出 printf("重复字符列表:"); for (int i = 0; i < len; i++) { unsigned char c = (unsigned char)str[i]; if (count[c] > 1 && !added[c]) { printf("%c ", c); added[c] = true; } } printf("\n"); // 可选:输出每个字符的出现次数 printf("字符计数:\n"); for (int i = 0; i < 256; i++) { if (count[i] > 0) { printf("%c: %d\n", (char)i, count[i]); } } } int main() { const char *my_string = "acabcabcff"; find_duplicates(my_string); return 0; }
方法2:双重循环检查(无需额外数组,适合小字符串)
如果不想用额外数组,可以用双重循环,对每个字符检查后面是否有重复,同时记录已经输出过的字符避免重复打印:
#include <stdio.h> #include <string.h> void find_duplicates(const char *str) { int len = strlen(str); printf("重复字符列表:"); for (int i = 0; i < len; i++) { bool is_duplicate = false; bool already_printed = false; // 检查当前字符是否在之前已经被打印过 for (int k = 0; k < i; k++) { if (str[k] == str[i]) { already_printed = true; break; } } if (already_printed) continue; // 检查当前字符后面是否有重复 for (int j = i + 1; j < len; j++) { if (str[i] == str[j]) { is_duplicate = true; break; } } if (is_duplicate) { printf("%c ", str[i]); } } printf("\n"); } int main() { const char *my_string = "acabcabcff"; find_duplicates(my_string); return 0; }
说明
- 方法1的时间复杂度是O(n),效率更高,适合长字符串;
- 方法2的时间复杂度是O(n²),适合短字符串实现;
- 两种方法都能实现类似Python代码的效果:找出所有出现过多次的字符,且每个重复字符只输出一次。
内容的提问来源于stack exchange,提问作者Argon_Ghost
相关产品推荐
相关产品推荐

