如何用字符指针查找首个重复字符组?代码无返回值排查
你的代码问题分析与修复
嘿,我帮你排查了下这段代码,它没法正常工作主要是踩了两个关键的坑:
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
相关产品推荐
相关产品推荐

