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

如何用字符指针查找首个重复字符组?代码无返回值排查

你的代码问题分析与修复

嘿,我帮你排查了下这段代码,它没法正常工作主要是踩了两个关键的坑:

1. 野指针引发的未定义行为

你声明了char *currentChar;但完全没给它指定有效的内存指向——这就是个野指针!当你执行*currentChar = *pText;时,相当于往一个随机内存地址写数据,这种操作属于未定义行为:程序可能直接崩溃、输出乱码,或者像你遇到的那样完全没有输出,全看系统“心情”。

其实你根本不需要用指针来存储前一个字符,用普通的char变量就足够,还安全得多。

2. 循环逻辑顺序完全搞反了

你在循环里先判断(*pText)==(*currentChar),但第一次循环时currentChar连初始值都没有,这个比较完全没有意义。而且你的逻辑是先比较再保存当前字符,直接错过了第一个可能的重复对,顺序完全反了。

修正后的代码

根据你给出的示例(输入"Be happy now"返回"ppy now"),我们要找的是第一组连续重复的字符,然后返回从这组重复字符的第一个位置开始的字符串。修正后的代码如下:

// 示例1返回结果:输入"Be happy now"返回"ppy now" 
// 假设存在一组重复字母 
char * findDouble( char text[]){ 
    // 先处理空字符串的边界情况
    if (text == NULL || *text == '\0') {
        return NULL;
    }

    char *pText = text;
    char prevChar = *pText; // 用普通char存前一个字符,避免指针问题
    pText++; // 从第二个字符开始遍历

    while(*pText != '\0') { 
        // 检查当前字符和前一个是否重复
        if(*pText == prevChar) { 
            // 返回重复组第一个字符的地址(往前退一步)
            return pText - 1;
        }
        prevChar = *pText; // 更新前一个字符
        pText++;
    } 
    // 题目说假设存在重复,这里是兜底处理
    return NULL;
}

为什么这个能正常工作?

当你传入"Be happy now"时:

  • 遍历到第一个'p'(字符串索引5)时,prevChar是'a',二者不相等;
  • 接着pText移动到下一个'p'(索引6),此时*pText和prevChar都是'p',触发返回逻辑,返回的是pText - 1也就是索引5的地址,对应的字符串正好是"ppy now",完美匹配你的需求。

额外说明

如果你原本的需求是找和之前任意位置字符重复的情况(而非连续重复),那逻辑需要调整,但从你的示例输入输出来看,显然是要找连续重复的第一组字符,所以上面的代码完全适配。

内容的提问来源于stack exchange,提问作者jkk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:47:37