C语言二进制转换程序无法输出数组,请求排查原因
C语言二进制转换程序无法输出数组,请求排查原因
兄弟,我看了你贴的这段C语言二进制转换的代码片段,虽然你只写到int counter = 0;就没了,但光现有的代码里就藏着几个容易踩的坑,再结合这类程序常见的问题,我帮你把可能出问题的地方都捋一遍:
首先说你写的clearBuffer函数,这里有个严重的问题:char dummy;定义后没初始化,直接就用while (dummy != '\n')来判断,这属于未定义行为——dummy的初始值是随机的,运气不好的话可能直接跳过循环,缓冲区没清干净,导致后续输入或者程序逻辑乱套;运气更差的话甚至会触发死循环。正确的写法应该是先读取字符再判断,比如改成这样:
void clearBuffer() { char dummy; while ((dummy = getchar()) != '\n' && dummy != EOF); }
再说说这类二进制转换程序常犯的、会导致无法正确输出数组的问题,大概率你后续的代码也会碰到:
- 数组空间不足:int类型一般是4字节32位,如果你定义的数组长度小于32,当输入的数字二进制位数超过数组长度时,就会发生数组越界,程序要么崩溃要么输出错误结果。稳妥点可以用
#include <limits.h>里的CHAR_BIT * sizeof(int)来确定数组的长度,保证能存下所有二进制位。 - 二进制位存储顺序搞反:很多人会用
temp % 2取余数的方式存二进制位,但这个取的是最低位,所以数组里存的是从低位到高位的顺序,如果直接正序输出数组,得到的二进制是倒着的,看起来就像“没输出正确结果”。得倒着遍历数组才能输出正确的顺序。 - 没处理输入为0的情况:如果输入是0,循环条件
temp != 0永远不成立,数组里就啥都没存,自然输出为空,必须单独处理这个特殊情况。 - 没做输入验证:如果用户输入的不是整数,
scanf("%i", &input)会失败,input还是你初始的-1,后续转换逻辑全乱套,最好加个判断确保输入有效。
给你贴个修正后的完整示例代码,你可以参考下:
#include <stdio.h> #include <limits.h> void clearBuffer() { char dummy; while ((dummy = getchar()) != '\n' && dummy != EOF); } int main() { int input = -1; printf("\n\nInput number: "); // 验证输入是否有效 if (scanf("%i", &input) != 1) { printf("输入无效,请输入整数!\n"); clearBuffer(); return 1; } clearBuffer(); // 定义足够大的数组存储二进制位 int binary[CHAR_BIT * sizeof(int)]; int counter = 0; // 单独处理输入为0的情况 if (input == 0) { binary[counter++] = 0; } else { int temp = input; // 存储每一位二进制(从低位到高位) while (temp != 0) { binary[counter++] = temp % 2; temp /= 2; } } // 倒序输出数组,得到正确的二进制顺序 printf("二进制结果:"); if (counter == 0) { printf("0"); } else { for (int i = counter - 1; i >= 0; i--) { printf("%d", binary[i]); } } printf("\n"); return 0; }
你可以对照着自己的代码,看看是不是踩了上面说的这些坑,调整一下应该就能正常输出数组里的二进制位啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

