C语言实现二进制转换器时char数组输出乱码问题排查
问题根因
乱码来自两个代码bug:
- C语言字符串要求以
\0(空终止符)作为结束标记,你逐字符写入数组后没有手动添加终止符,strrev、puts等字符串函数会持续读取数组后方未初始化的栈内存垃圾值,直到随机碰到内存里的\0才停止,你看到的前置乱码就是这部分垃圾值。 - 循环在处理到第16位(最后一位二进制位)时,会额外多写入一个尾部空格,属于逻辑冗余。
修复方案
- 逐字符写入完成后,在当前指针位置手动写入
\0作为字符串终止符,也可以直接在声明数组时初始化为全0,避免残留垃圾值。 - 给空格添加判断逻辑:仅当不是最后一位二进制位时,才每4位插入一个分隔空格,避免尾部多打空格。
- 可以直接用
'0'、'1'、' '字符常量代替十六进制转义写法,可读性更高,编译后生成的指令完全一致。
修复后可运行代码
#include <stdio.h> #include <string.h> int main() { int number = 5; int temp_num, remain, quotient; char result[40]; char *result_ptr = result; int output_size = 16; temp_num = number; for (int i = 0; i < output_size; i++) { remain = temp_num % 2; quotient = temp_num / 2; *result_ptr++ = remain ? '1' : '0'; // 每4位分隔,最后一位后不加分隔空格 if ((i + 1) % 4 == 0 && i != output_size - 1) { *result_ptr++ = ' '; } temp_num = quotient; } *result_ptr = '\0'; // 手动添加字符串终止符 strrev(result); puts(result); return 0; }
运行后输出为:0000 0000 0000 0101,符合预期。
注意事项
- 所有C标准库中处理字符串的函数(包括
puts、strlen、strcat、strrev等),都默认读取到\0才会停止,只要是手动逐字符构造字符串,必须在有效内容末尾添加\0,否则必然会出现内存越界读取、输出乱码的问题。
内容的提问来源于stack exchange,提问作者SUD pythonism
相关产品推荐
相关产品推荐

