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

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,无法触发后续循环处理新出现的重复字符,不清楚原因。


问题根源分析

  1. 变量作用域冲突:你在do-while循环内部重新定义了int ver = 0;,这会覆盖函数开头定义的外部ver变量。循环结束时判断的是外部的ver(初始值一直是0),导致循环只执行一次就退出,无法处理删除后新产生的相邻重复。
  2. 字符串未添加终止符:处理完res数组后没有添加'\0',strcpy和strlen会因为找不到字符串终止标记而出错,导致数据乱码。
  3. 多次循环效率低:原思路通过多次循环扫描字符串,不仅效率低,还容易因变量问题导致逻辑错误。

修正后的代码(栈思路更高效)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:15:40