字符串转二进制代码异常求助:输出出现错误数字与符号
问题分析与修复方案
核心问题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
相关产品推荐
相关产品推荐

