You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:46:31