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
相关产品推荐
相关产品推荐

