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

C语言字符串重复函数异常求助:无法生成正确重复字符串

问题修正与原因分析

修正后的代码

char *repeat_str(size_t count, char *src) {
    size_t length = strlen(src);
    // 分配内存:重复count次的总字符数 + 1个字节存字符串结束符'\0'
    char *ausgabe = calloc(length * count + 1, sizeof(char));
    if (!ausgabe) { // 必须检查内存分配是否成功
        return NULL;
    }

    size_t pos = 0;
    for (size_t i = 0; i < count; i++) {
        for (size_t j = 0; j < length; j++) {
            ausgabe[pos++] = src[j];
        }
    }
    // calloc已将内存初始化为0,所以末尾自动有'\0'
    return ausgabe;
}

原代码的问题拆解

  1. 循环次数多算了一次
    原代码用i <= ((int) count),这会让循环执行count+1次(比如count=3时跑4次),不仅超出预期重复次数,还可能触发内存越界。正确逻辑是i < count,刚好循环count次。

  2. 索引计算逻辑完全混乱
    原代码用ausgabe[i+j+z]定位写入位置,还把z每次翻倍,导致第一次写入从length位置开始(前面全是calloc初始化的'\0',相当于字符串开头就是结束符,自然无输出),后续写入位置越来越偏,直接超出分配的内存范围,要么无输出要么触发未知错误。
    正确的做法是按顺序累加位置:每次写完一个字符串后,把写入指针往后移length位,或者直接用i*length + j计算每个字符的索引。

  3. 内存分配大小算错
    原代码分配length*(count+1)字节,正确的应该是length*count + 1——重复count次的总字符数是length*count,必须额外留1个字节存字符串结束符'\0'。原代码的分配逻辑在count较小时可能碰巧能用,但本质是错误的,极端场景会导致内存不足。

  4. 类型转换有溢出风险
    把size_t类型的count强制转成int,当count超过int的最大值时会直接溢出,循环逻辑彻底混乱。处理长度、计数这类变量,应该统一用size_t类型,避免溢出问题。

  5. 没检查内存分配结果
    原代码没判断calloc是否成功,当内存不足时会返回NULL,后续操作会触发不可预料的错误。

异常输出的具体原因

  • 保留z时无输出:第一次写入的位置是0+j+length,也就是从字符串第length位开始写,前面的位置都是'\0',所以字符串开头就是结束符,自然输出为空。
  • 移除z后乱码:原代码循环次数多了一次,且用i+j做索引,比如i=1、j=0时,索引是1,会覆盖i=0、j=1的位置,导致字符被反复覆盖;再加上循环次数超标,最终出现重复的单个字符和末尾乱码,本质是内存越界后写入了不属于自己的内存区域,也没有正确的结束符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:31:16