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

C语言实现字符串每字符重复一次时输出乱码的问题求助

C语言实现字符重复字符串输出乱码修复

问题根因

你的代码存在3个直接导致乱码、运行异常的问题:

  • 数组索引越界:for循环第一次执行时i=0,fin[i*2-1]等价于访问fin[-1],属于数组范围外的内存,写入操作会破坏栈上的其他数据,触发未定义行为。
  • 新字符串缺少结束符:C语言中char数组存储的字符串必须以'\0'作为结尾标记,你给fin数组赋值完所有重复字符后,没有手动追加结束符,printf用%s输出时会顺着内存地址一直读取未初始化的垃圾值,直到碰到随机的0值才停止,你看到的╠╠╠╠这类符号就是未初始化内存里的无效数据。
  • 使用了废弃的不安全函数:gets()不会校验输入长度,只要输入长度超过str数组的20字节上限就会越界写内存,已经被C标准移除,不建议使用。

修正后的可运行代码

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

int main() {
    char str[20], fin[40];
    int i, j=0;

    // 替换废弃的gets,限制最大读取长度避免越界
    fgets(str, sizeof(str), stdin);
    // 去掉fgets可能读入的末尾换行符
    str[strcspn(str, "\n")] = '\0';

    // 计算原字符串有效长度
    while (str[j] != '\0'){
        j++;
    }

    // 逐字符重复写入,索引从0开始计算,避免越界
    for (i = 0; i < j; i++){
        fin[i*2] = str[i];
        fin[i*2+1] = str[i];
    }
    // 关键操作:在新字符串末尾追加结束符
    fin[j*2] = '\0';

    printf("%s\n", fin);
    return 0;
}

补充说明

用char数组存储字符串时,一定要预留结束符的存储空间:比如你定义的str[20]最多存19个有效字符(留1字节存'\0'),重复后总有效长度是38个字符,加上结束符总共占39字节,fin[40]的长度是完全足够的,只要修正索引错误、补对结束符就不会出现乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:09:23