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

C语言字符串二进制编码程序输出异常,求问题排查

问题排查与修正

1. 循环完全未执行(根本原因)

你的encode_string函数中,循环条件for(int t = len; t <= 0; t--)完全错误:

  • 初始t被赋值为字符串长度(正数),而循环条件要求t <= 0,第一次判断就不满足,循环体一次都不会运行。
  • 这导致bytes数组完全没有被赋值,里面全是栈内存的随机垃圾值,最终main函数输出的就是这些垃圾数据。

正确的循环应该遍历所有字符(包括终止符\0),改为:

for(int t = 0; t <= len; t++)

2. 位运算逻辑错误+未给数组赋值

原代码里的位运算(q << string[t]) & 1完全不符合二进制位提取逻辑:

  • q是0-7的循环变量,string[t]是字符的ASCII值(比如'H'是72),将q左移72位是无意义操作,还会触发未定义行为(移位位数超过类型比特数)。
  • 更关键的是,原函数只做了printf,根本没把计算结果存入bytes数组,这也是main输出垃圾值的核心原因。

正确的二进制位提取逻辑(以高位到低位为例):
要获取字符c的第q位(q从0到7,0对应最高位),用(c >> (7 - q)) & 1;如果需要低位到高位,用(c >> q) & 1。同时要把结果赋值给bytes[t][q]。

3. 参数设计冗余

原函数参数bool bytes[strlen(string)+1][8]中,strlen(string)在参数列表中计算一次,函数内部又重复调用strlen(string),完全可以把字符串长度作为参数传入,避免重复计算,让代码更清晰。


修正后的完整代码

函数实现

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

void encode_string(const char string[], int len, bool bytes[][8]){
    for(int t = 0; t <= len; t++){
        // 转成unsigned char避免符号位干扰
        unsigned char c = (unsigned char)string[t];
        for(int q = 0; q < 8; q++){
            // 提取高位到低位的二进制位,存入数组
            bytes[t][q] = (c >> (7 - q)) & 1;
        }
    }
}

main函数

int main(){
    char* text = "Hello, how are you?";
    const int len = strlen(text);
    bool bytes1[len+1][8];
    encode_string(text, len, bytes1);
    for(int j = 0; j <= len; j++){
        printf("%c: ", text[j]);
        for(int i = 0; i < 8; i++){
            printf("%d", bytes1[j][i]);
        }
        printf("\n");
    }
    return 0;
}

修正后效果

运行后会输出每个字符对应的8位二进制编码,比如:

H: 01001000
e: 01100101
l: 01101100
l: 01101100
o: 01101111
,: 00101100
 : 00100000
...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:30:58