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

字符串转二进制代码异常求助:输出出现错误数字与符号

问题分析与修复方案

核心问题1:循环条件完全错误

encode_string函数里的循环条件j <= bytes[strlen(string)+1][8]是严重错误的:

  • bytes[strlen(string)+1][8]是访问二维数组的越界元素(第二维索引最大为7,因为数组定义是[8]),这个值是随机内存垃圾,导致循环次数完全不可控,会越界访问string数组,出现乱码。
  • 正确的循环条件应该是遍历字符串的每个字符(包括终止符\0),即j <= strlen(string)或者j < strlen(string) + 1。

核心问题2:未向bytes数组写入数据

你的encode_string函数仅打印了字符的二进制,但完全没有把计算出的二进制位存入传入的bytes数组。main函数打印bytes1时,输出的都是未初始化的内存垃圾值,这就是错误数字的来源。

修复后的完整代码

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

// 提前传入字符串长度,避免参数中计算strlen的问题,提升可读性
void encode_string(const char string[], size_t str_len, bool bytes[str_len+1][8]){
    for(int j = 0; j <= str_len; j++){
        printf("%c: ", string[j]);
        for( int i = 7; i >= 0; i-- ) {
            int bit = (string[j] >> i) & 1;
            printf("%d", bit);
            // 将二进制位写入bytes数组,对应main函数的打印顺序
            bytes[j][7 - i] = bit;
        }
        printf("\n");
    }
}

int main(){
    char* text = "Hello, how are you?";
    const size_t len = strlen(text);
    bool bytes1[len+1][8];
    encode_string(text, len, bytes1);
    
    printf("\n--- 从bytes1数组读取的结果 ---\n");
    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;
}

额外优化点

  • 用size_t类型存储字符串长度,符合C标准库的返回类型规范(strlen返回size_t)。
  • 修复后bytes数组会正确存储每个字符的二进制位,main函数的输出与encode_string内的打印结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:10:43