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

请求排查统计字符ASCII二进制中0和1个数的代码错误

C语言统计字符ASCII二进制0和1数量的代码错误排查

我需要实现以下功能:

  • 输入一个字符
  • 统计其ASCII值二进制表示中0和1的数量
  • 输出0的数量、1的数量以及两者的乘积

编写了如下C语言代码,当输入字符'A'时,预期输出为5、2、10,但实际得到16、7、112,请帮忙排查错误:

#include <stdio.h>
int main(){
    
    int x,y,count0,count1,a,r;
        scanf("%c",&x);
        a = (int)x;

        count0 = 0;
        count1 = 0;
        while(a != 0){
            r=a%2;
            if(r == 0) 
                count0 = count0 + 1;
            else if(r == 1) 
                count1 = count1 + 1;
            a = a/2;
        }
        y = count1 * count0;
        printf("%d\n",count0);
        printf("%d\n",count1);
        printf("%d",y);
        return 0;
}

错误原因

  1. 变量类型不匹配引发未定义行为
    代码中x被声明为int类型,但scanf("%c", &x)的%c格式符要求参数是char*类型,传递int*会触发未定义行为。多数系统中int占4字节、char占1字节,scanf仅会向x的最低1字节写入字符的ASCII值,而x的高3字节未初始化,保留随机垃圾值。最终a = (int)x得到的不是单纯的字符ASCII值,而是包含随机高位的整数,循环统计的是整个32位整数的二进制位,因此得到错误的计数结果。

  2. 循环逻辑的潜在适配问题
    当前while(a != 0)的循环会在a变为0后提前终止,仅统计从最高位1到最低位的有效二进制位(不包含前导0)。若你需要统计**完整8位ASCII码(含前导0)**的0和1数量,该循环无法满足需求。


修正后的代码

方案1:修复变量类型(匹配你的预期输出)

将x改为char类型,确保scanf正确读取字符的ASCII值:

#include <stdio.h>
int main(){
    
    char x;
    int y, count0, count1, a, r;
    scanf("%c", &x);
    a = x; // 自动完成char到int的类型转换

    count0 = 0;
    count1 = 0;
    while(a != 0){
        r = a % 2;
        if(r == 0) 
            count0++;
        else 
            count1++;
        a /= 2;
    }
    y = count1 * count0;
    printf("%d\n", count0);
    printf("%d\n", count1);
    printf("%d", y);
    return 0;
}

输入'A'时,输出为5、2、10,符合预期。

方案2:统计完整8位ASCII码(含前导0)

若需要统计8位完整二进制中的0和1数量,将循环改为固定执行8次:

#include <stdio.h>
int main(){
    
    char x;
    int y, count0, count1, a, r;
    scanf("%c", &x);
    a = x;

    count0 = 0;
    count1 = 0;
    for(int i = 0; i < 8; i++){ // 循环8次处理每一位
        r = a % 2;
        if(r == 0) 
            count0++;
        else 
            count1++;
        a /= 2;
    }
    y = count1 * count0;
    printf("%d\n", count0);
    printf("%d\n", count1);
    printf("%d", y);
    return 0;
}

输入'A'时,输出为6、2、12(对应二进制01000001的6个0和2个1)。

内容的提问来源于stack exchange,提问作者ashutosh goel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:53:08