C代码在假定运行scanf行时停止

  • 本文关键字:scanf 运行 代码 c scanf
  • 更新时间 :
  • 英文 :


我写了一段代码,考虑到输入是正确的二进制数,该代码应该计算从用户那里得到的二进制数中有多少活动位(1(。

每次代码应该在main((中运行scanf((时,它都会被卡住,它不会停止运行,它只是感觉自己在思考,不会给出任何错误

这是我写的代码,在这种情况下打印";请输入二进制数:";然后它就会被卡住

#include <stdio.h>

void count_bits(long int UserNum){
int cnt=0;
while(UserNum>0)
{
if (UserNum%10==1)
{
cnt++;  
}   
}
printf("there are %d active bitsn",cnt);
}

int main(){
long int UserNum=0;
printf("Please enter a binaric number: ");
scanf("%ld" , &UserNum);
count_bits(UserNum);

return 1;
}

如果我先这样写scanf((,它甚至不会打印:

scanf("%ld" , &UserNum);
printf("Please enter a binaric number: ");

我在这里做错了什么?

编辑:示例输入:1101100

输出:有4个有效位

输入:0110100111

输出:有6个有效位

基本上计算中有多少个

我假设您希望将用户输入的十进制数解释为二进制数。您的代码不会检查您的输入是否遵循此约定。如果输入的数字包含0或1以外的数字,则每个不是1的数字都将被解释为0。(UserNum%10==1(

由于这个假设,我不讨论通常必须用UserNum % 2UserNum & 1测试比特的事实。(如果你想知道如何输入或打印二进制数字而不是十进制数字,请单独问一个问题。(

请注意,如果您输入的数字位数过多,您可能很容易遇到超长问题。


主要问题:函数count_bits中有一个无休止的循环,因为您没有更新UserNum

你可以这样更改:

void count_bits(long int UserNum){
int cnt=0;
while(UserNum>0)
{
if (UserNum%10==1)
{
cnt++;  
}
UserNum /= 10;
}
printf("there are %d active bitsn",cnt);
}

有了这个更改,代码就如预期的那样为我工作了。

Please enter a binaric number: 0110100111
there are 6 active bits

一个数字太大的例子。(我添加了一行printf("You entered %ldn", UserNum);。(

Please enter a binaric number: 10110111011110111110
You entered 9223372036854775807
there are 0 active bits

如果在main中交换printfscanf(与count_bits中的无休止循环(;请输入二进制数:";未打印,因为它不包含换行符,并且默认情况下输出为行缓冲。显然scanf导致刷新输出。

如果您将其更改为打印类似的尾随换行符

printf("Please enter a binaric number:n");

它应该在进入CCD_ 12之前打印出来(使用循环(。

正如在多个注释中指出的,UserNum>0始终为真,因此循环从未停止。

但无论如何,count_bits函数都是错误的。对比特进行模10运算是毫无意义的。

你想要这个:

void count_bits(long int UserNum) {
int cnt = 0;
while (UserNum > 0)
{
if (UserNum % 2)  // if UserNum is odd, then bit no. 0 is 1
cnt++;
UserNum = UserNum / 2;  // division by 2 shifts bits to the right
}
printf("there are %d active bitsn", cnt);
}

当我们在比特级别上工作时,使用比特移位和比特掩码操作会更习惯:

void count_bits(long int UserNum) {
int cnt = 0;
while (UserNum > 0)
{
if (UserNum & 1)    // mask all bits but bit no. 0
cnt++;
UserNum = UserNum >> 1;   // shift bits to the right
}
printf("there are %d active bitsn", cnt);
}

尽管如此,仍有改进的空间。尤其是负数不能正常工作(不过我没有测试,你自己看看(。

有更复杂的比特计数方法,如这里所述:如何计算32位整数中的设置比特数?

最新更新