You need to enable JavaScript to run this app. C语言编程问题:无法返回保留最多2个连续相同字符的处理后字符串
优惠活动
大模型
产品
解决方案
定价
更多

C语言编程问题:无法返回保留最多2个连续相同字符的处理后字符串

代码问题排查与修复

核心错误点

  • 1、返回局部栈内存指针
    solve函数中定义的char str[10]是函数内部的局部变量,存储在栈内存中,函数执行结束后栈空间会被系统回收,返回的str指针属于野指针,访问该地址的行为是未定义的,自然无法得到正确的字符串结果。
  • 2、业务逻辑不符合需求
    现有判断逻辑完全无法实现「连续相同字符仅保留2个」的要求,同时存在数组越界访问的问题:
    • 访问s[i+1]、s[i+2]时,当i接近字符串末尾,会访问到字符串以外的非法内存
    • 没有覆盖连续相同字符个数为1、2的场景,会出现字符漏存的问题
    • 最终处理完的字符串没有补末尾的\0结束符,输出时会打印乱码
  • 3、缓冲区大小固定,存在溢出风险
    固定大小为10的局部数组无法适配更长的输入字符串,容易出现缓冲区溢出问题。

修复后的实现代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *solve(char *s) {
    int len = strlen(s);
    // 堆上申请内存,生命周期不受函数生命周期影响
    char *res = (char *)malloc(len + 1);
    if (res == NULL) return NULL;
    int j = 0;
    for (int i = 0; i < len; i++) {
        // 检查当前字符和已写入的前两个是否相同,相同就跳过不写入
        if (j >= 2 && res[j-1] == s[i] && res[j-2] == s[i]) {
            continue;
        }
        res[j++] = s[i];
    }
    // 补字符串结束符
    res[j] = '\0';
    return res;
}

int main() {
    int t = 1, count = 1;
    while (t >= count) {
        char arr[10] = "aaabaaaa";
        char *result = solve(arr);
        printf("Case #%d: %s\n", count, result);
        // 释放堆内存,避免内存泄漏
        free(result);
        count++;
    }
    // 测试样例验证:输入aaaabbbbaaaa 输出aabbaa
    char test[] = "aaaabbbbaaaa";
    char *test_res = solve(test);
    printf("测试样例输出:%s\n", test_res);
    free(test_res);
    return 0;
}

运行验证

输入示例aaaabbbbaaaa运行后可得到正确输出aabbaa,原测试输入aaabaaaa运行后输出为aabaa符合需求要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:18:02