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

