二进制数1计数程序scanf执行异常问题求助
问题分析与修复方案
你遇到的程序卡死、提示不显示的问题,主要有两个核心原因,还有一个可以优化的点,我一个个给你拆解:
1. 死循环导致程序卡死
你的count_bits函数里的while循环永远不会终止!看这段代码:
while(UserNum>0) { if (UserNum%10==1) { cnt++; } }
循环条件是UserNum>0,但循环体内完全没有修改UserNum的值——也就是说,只要输入的数大于0,这个循环会一直跑下去,程序自然就“卡死”了。
解决方法很简单:每次循环后要让UserNum缩小,因为你是把二进制数当作十进制数字处理的,所以每次循环应该除以10,去掉最后一位:
while(UserNum>0) { if (UserNum%10==1) { cnt++; } UserNum /= 10; // 关键:每次循环后缩小数值,让循环能终止 }
2. 标准输出缓冲区未刷新导致提示不显示
C语言中,printf的输出默认是行缓冲模式——只有当输出内容包含换行符\n,或者缓冲区被手动刷新时,内容才会显示到终端。
你的提示语句是:
printf("Please enter a binaric number: ");
没有换行符,所以内容会留在缓冲区里。如果scanf在后面,scanf会阻塞等待输入,此时缓冲区的内容还没输出,就会出现“程序卡死在输入环节,看不到提示”的假象;如果把scanf放在printf前面,那printf的内容还在缓冲区,自然看不到提示。
解决方法有两种:
- 给提示语句加上换行符:
printf("Please enter a binaric number: \n"); - 或者手动刷新缓冲区:
printf("Please enter a binaric number: "); fflush(stdout); // 强制刷新输出缓冲区,让提示立刻显示
3. 可选优化:更合理的二进制数输入方式
你现在用%ld读取输入,本质是把二进制数当作十进制整数来处理,这会有两个潜在问题:
- 输入带前导0的二进制数(比如
0110100111),%ld会自动忽略前导0,虽然统计1的个数结果是对的,但不符合二进制数的输入逻辑; - 如果输入的二进制数很长(超过
long int能表示的十进制范围),会导致整数溢出,行为未定义。
更合理的方式是把输入当作字符串来处理,这样可以避免溢出,也能正确处理前导0。示例代码如下:
#include <stdio.h> #include <string.h> void count_bits(const char *binary_str) { int cnt = 0; for (int i = 0; binary_str[i] != '\0'; i++) { if (binary_str[i] == '1') { cnt++; } } printf("there are %d active bits\n", cnt); } int main() { char binary_str[100]; // 假设输入的二进制数不超过99位 printf("Please enter a binary number: "); fflush(stdout); scanf("%s", binary_str); count_bits(binary_str); return 0; }
修正后的完整代码(保留原整数处理逻辑)
如果想继续用整数处理的方式,修正后的代码如下:
#include <stdio.h> void count_bits(long int UserNum) { int cnt = 0; while (UserNum > 0) { if (UserNum % 10 == 1) { cnt++; } UserNum /= 10; // 新增:让循环能终止 } printf("there are %d active bits\n", cnt); } int main() { long int UserNum = 0; printf("Please enter a binary number: "); fflush(stdout); // 强制刷新缓冲区,确保提示显示 scanf("%ld", &UserNum); count_bits(UserNum); return 0; // 这里建议返回0表示程序正常结束,原代码返回1通常表示错误 }
测试一下你的示例输入:
- 输入
1101100,输出there are 4 active bits,符合预期; - 输入
0110100111,因为%ld会忽略前导0,实际读取的是110100111,统计1的个数是6,也符合预期。
内容的提问来源于stack exchange,提问作者Roy Shiff
相关产品推荐
相关产品推荐

