C语言删除相邻重复字符代码的do-while循环问题求助
问题:相邻重复字符删除代码错误排查
题目要求
给定小写英文字母组成的字符串s,重复执行相邻重复字符删除操作(删除两个相邻且相等的字母),直到无法再删除为止,返回最终字符串。
- 示例1:输入
s="abbaca",输出"ca" - 示例2:输入
s="azxxzy",输出"ay"
我的代码(测试用例为"abbaca")
char res[100]; //answer char * removeDuplicates(char * s){ //int that verifies if any char from the string can be deleted int ver = 0; //do while loop that reiterates to eliminate the duplicates do { int lenght = strlen(s); int j = 0; int ver = 0; //for loop that if there are duplicates adds one to ver and deletes the duplicate for (int i = 0; i < lenght ; i++){ if (s[i] == s[i + 1]){ i++; j--; ver++; } else { res[j] = s[i]; } j++; } //copying the res string into the s to redo the loop if necessary strcpy(s,res); } while (ver > 0); return res; }
遇到的问题
函数返回结果为"aaca",调试发现循环结束后ver变量总是回到0,无法触发后续循环处理新出现的重复字符,不清楚原因。
问题根源分析
- 变量作用域冲突:你在
do-while循环内部重新定义了int ver = 0;,这会覆盖函数开头定义的外部ver变量。循环结束时判断的是外部的ver(初始值一直是0),导致循环只执行一次就退出,无法处理删除后新产生的相邻重复。 - 字符串未添加终止符:处理完
res数组后没有添加'\0',strcpy和strlen会因为找不到字符串终止标记而出错,导致数据乱码。 - 多次循环效率低:原思路通过多次循环扫描字符串,不仅效率低,还容易因变量问题导致逻辑错误。
修正后的代码(栈思路更高效)
char * removeDuplicates(char * s){ static char res[100]; // 用static保证返回后内存有效,避免野指针 int top = 0; // 栈顶指针,记录当前栈中元素个数 for (int i = 0; s[i] != '\0'; i++) { // 栈不为空且当前字符与栈顶字符相等,弹出栈顶 if (top > 0 && res[top - 1] == s[i]) { top--; } else { // 否则将当前字符压入栈 res[top++] = s[i]; } } res[top] = '\0'; // 添加字符串终止符,确保是合法C字符串 return res; }
修正说明
- 栈思路一次遍历完成:不需要多次循环,一次遍历就能处理所有相邻重复(包括删除后新出现的重复)。比如处理
"abbaca"时,栈会自动处理掉删除bb后新出现的aa,最终得到正确结果"ca"。 - 解决作用域问题:去掉了循环内重复定义的
ver变量,用栈的逻辑自然避免了多次循环的判断问题。 - 修复字符串终止问题:主动添加
'\0',确保res是合法的C字符串。 - 避免野指针:用
static修饰res,函数结束后数组内存不会被释放,返回的指针有效。
内容的提问来源于stack exchange,提问作者Rafael Carro Gaudim
相关产品推荐
相关产品推荐

