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

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;
}

修正说明

  1. 用start指针保存原字符串的起始位置,避免遍历后丢失原地址;
  2. 用独立的j作为新字符串的索引,根据字符是否需要重复灵活递增;
  3. 直接用循环结束后的j设置终止符,确保位置正确;
  4. 添加了malloc返回值检查,同时处理了str为NULL的边界情况;
  5. 统一使用size_t类型作为索引,避免类型不匹配导致的溢出;
  6. 移除冗余的q变量,简化逻辑。

内容的提问来源于stack exchange,提问作者ori in

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:20:58