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

C语言实现二进制转换器时char数组输出乱码问题排查

问题根因

乱码来自两个代码bug:

  1. C语言字符串要求以\0(空终止符)作为结束标记,你逐字符写入数组后没有手动添加终止符,strrev、puts等字符串函数会持续读取数组后方未初始化的栈内存垃圾值,直到随机碰到内存里的\0才停止,你看到的前置乱码就是这部分垃圾值。
  2. 循环在处理到第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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:48:56