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
相关产品推荐
相关产品推荐

