You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二进制数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:33:11