C语言十进制转二进制输出缺一位:8位数组为何仅返回7位?
十进制转8位二进制的位数缺失问题分析与修复
问题原因
- 循环执行次数不足:输入72的二进制是
1001000,共7个有效位,你的循环仅在number != 0时执行,会迭代7次,只给binary[0]到binary[6]赋值,第8个元素binary[7]未被处理。 - 缺少字符串终止符:C语言中
printf("%s")输出字符串时,需要以'\0'(空字符)作为结束标志。你没有手动添加这个终止符,当前能输出7位只是巧合——恰好binary[7]的内存值是'\0',如果内存值随机,会输出乱码直到遇到'\0'。 - 数组长度设计缺陷:要存储8位二进制字符串,数组长度至少需要9(8位字符+1位终止符),否则添加终止符时会出现数组越界。
修复方案
方案一:固定循环8次(推荐)
直接循环8次,确保填充满8位,同时初始化数组并预留终止符位置:
#include <cs50.h> #include <stdio.h> int main(void) { int number = get_int("Number: "); char binary[9] = {0}; // 8位二进制 + 1位'\0'终止符,初始化为0(即'\0') for (int i = 0; i < 8; i++) { binary[i] = (number % 2 == 0) ? '0' : '1'; number /= 2; } printf("%s\n", binary); }
方案二:补全剩余位并添加终止符
保留原循环逻辑,补全未填充的位为'0',并手动添加终止符:
#include <cs50.h> #include <stdio.h> int main(void) { int number = get_int("Number: "); char binary[9]; // 预留终止符位置 int i; for (i = 0; number != 0 ; i++) { binary[i] = (number % 2 == 0) ? '0' : '1'; number /= 2; } // 补全剩余位为'0' for (; i < 8; i++) { binary[i] = '0'; } // 添加字符串终止符 binary[8] = '\0'; printf("%s\n", binary); }
注:你提到结果顺序与正确答案相反,后续可以通过反转数组来修正——比如填充完后,交换binary[0]和binary[7]、binary[1]和binary[6],以此类推。
内容的提问来源于stack exchange,提问作者Andressa
相关产品推荐
相关产品推荐

