我寫了一個代碼,考慮到輸入是一個正確的二進制數,它應該計算從用戶那里得到的二進制數中有多少個活動位(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 bits\n",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個活動位
input: 0110100111
輸出:有6個活動位
基本上數一數數字里有多少個
假設您希望將用戶輸入的十進制數解釋為二進制數。您的代碼不會檢查您的輸入是否遵循此約定。如果輸入的數字包含0或1以外的數字,則每個非1的數字都將被解釋為0。(
UserNum%10==1
)由于這個假設,我不討論這樣一個事實,即通常必須用
UserNum % 2
或UserNum & 1
來測試位。(如果您想知道如何輸入或打印二進制數而不是十進制數,請另問一個question.)請注意,如果輸入的數字太多,則很容易出現超限問題。
主要問題:你在函數
count_bits
中有一個無休止的循環,因為你沒有更新UserNum
。你可以這樣改變它:
有了這個變化,代碼就如預期的那樣適合我了。
數字太大的示例。(我添加了一行
printf("You entered %ld\n", UserNum);
。)如果交換
printf
中的printf
和scanf
(在count_bits
中有無休止的循環),則不會打印消息“Please enter a binaric number:”,因為它不包含換行符,并且默認輸出為line-buffered。顯然scanf
導致刷新輸出。如果將其更改為打印尾隨換行符,如
它應該在輸入
count_bits
(使用無限循環)之前打印出來。