C语言堆分配字符串:实现指定字符重复两次的代码故障排查
你的C语言字符串处理代码的问题及修复方案
代码存在的核心问题
- 指针偏移导致第二个循环失效:第一个
while循环里,你通过++str遍历原字符串,循环结束后str已经指向字符串末尾的'\0',后续第二个while(*str != '\0')的条件永远不成立,根本不会进入字符处理逻辑。 - 索引逻辑完全错误:你用
j=i绑定新、原字符串的索引,这不符合需求——遇到需要重复的字符时,新字符串的索引增长速度会比原字符串快。q变量属于冗余设计,只会增加逻辑混乱。 - 终止符位置越界:新字符串的总长度是原长度
taille加上重复的字符数k,终止符应放在索引taille + k的位置,你写的nouvelle[taille+1+k]='\0'会访问超出malloc分配的内存,属于越界访问,会触发未定义行为。 - 变量类型不匹配:
i和j使用int类型,但字符串长度可能超出int的取值范围,应该和taille、k统一用size_t类型,避免溢出问题。 - 未检查内存分配结果:
malloc可能分配失败并返回NULL,直接返回该值会导致后续使用时崩溃,需要显式检查。 - 非标准函数问题:标准C中没有
stringLength函数,应使用标准库的strlen,记得包含<string.h>头文件。
修正后的代码
#include <stdlib.h> #include <string.h> char *duplicate_c(const char *str, char c) { if (str == NULL) { return NULL; } size_t taille = strlen(str); size_t k = 0; const char *start = str; // 统计需要重复的字符数量 while (*start != '\0') { if (*start == c) { k++; } start++; } // 分配内存:原长度 + 重复字符数 + 终止符空间 char *nouvelle = malloc(taille + k + 1); if (nouvelle == NULL) { return NULL; } size_t j = 0; // 新字符串的独立索引 start = str; // 重置指针到原字符串起始位置 while (*start != '\0') { if (*start == c) { // 重复写入两次目标字符 nouvelle[j++] = *start; nouvelle[j++] = *start; } else { // 正常写入单次字符 nouvelle[j++] = *start; } start++; } // 添加字符串终止符 nouvelle[j] = '\0'; return nouvelle; }
修正说明
- 用
start指针保存原字符串的起始位置,避免遍历后丢失原地址; - 用独立的
j作为新字符串的索引,根据字符是否需要重复灵活递增; - 直接用循环结束后的
j设置终止符,确保位置正确; - 添加了
malloc返回值检查,同时处理了str为NULL的边界情况; - 统一使用
size_t类型作为索引,避免类型不匹配导致的溢出; - 移除冗余的
q变量,简化逻辑。
内容的提问来源于stack exchange,提问作者ori in
相关产品推荐
相关产品推荐

