基本上,我必须写一个代码,这样:
1.将字母作为输入。
1.计数其ascii值的二进制表示中的0和1的数量
1.报告(编号0)*(否。1s)
请帮我找出代码中的错误。
#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;
}
显然这是错误的,因为对于输入'A',它应该打印5,2,10,但它给出了16,7,112。
4条答案
按热度按时间pgky5nke1#
因为你把x声明为int,所以
scanf("%c",&x);
产生:测试c:5:17:警告:格式“%c”需要类型为“char *”的参数,但参数2的类型为“int *”[-Wformat=]
默认的char也是有符号的,如果你遇到一个负值,这可能会产生惊人数量的1和0。
将x的类型更改为
unsigned char
:那么代码就应该按照你的要求去做。
如果您的编译器中没有启用警告,请现在启用它们。它们通常有助于发现这样的问题。
8yoxcaq72#
我记得K&R的一个老把戏;c &= c - 1清除c中的最低1位。
4smxwvx53#
有两个问题:
1.正如teapot418在另一个答案中所说,你必须把你的字符读入一个无符号的char
1.当
a == 0
出现时,你就停止计数,这意味着你只会计数1
和0
,直到最重要的1
。除空格字符外,其值为32
或00100000
。您的代码将计数5个0
和1个1
。要解决这个问题,只需计算1
,然后通过count0 = 8 - count1
(或7 - count1
,对于7位ascii)计算0
的数量zpf6vheq4#
我同意@SRNissen的说法,正确的答案是
6,2,12
,因为'A'
在二进制中是0100 0001
。我用masking来做这件事的代码是: