请求排查统计字符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; }
错误原因
变量类型不匹配引发未定义行为
代码中x被声明为int类型,但scanf("%c", &x)的%c格式符要求参数是char*类型,传递int*会触发未定义行为。多数系统中int占4字节、char占1字节,scanf仅会向x的最低1字节写入字符的ASCII值,而x的高3字节未初始化,保留随机垃圾值。最终a = (int)x得到的不是单纯的字符ASCII值,而是包含随机高位的整数,循环统计的是整个32位整数的二进制位,因此得到错误的计数结果。循环逻辑的潜在适配问题
当前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
相关产品推荐
相关产品推荐

