2014-11-20 142 views
1

我有最奇怪的問題!我需要製作一個程序,用戶必須輸入一個10位數字。所以,我檢查輸入用do-while循環:Do-while循環不會結束嗎?

do 
{ 
    cout<<"Enter a 10-digit number: "<<endl; 
    cin>>number; 
} 
while (numberOfDigits(number) != 10); 

這裏是numberOfDigits功能:

int numberOfDigits(int num) 
    { 
     int d = 0; 

     while (num > 0) 
     { 
      num /= 10; 
      d++; 
     } 

     return d; 
    } 

所以,當我輸入一個數小於10,它循環並轉到啓動(告訴我再次輸入一個10位數字)。但是,當我輸入的數字超過10位時,將出現無限循環,並且控制檯不會停止打印「輸入10位數字:」...任何想法?

+1

嘗試將int更改爲long long – marsh 2014-11-20 21:06:46

+2

int通常爲32位寬;一個32位(帶符號)的整數值只能達到2 ** 31,或者剛剛超過20億,這正好是10位數字。除此之外的任何東西都不適合int,並且'cin'進入一個錯誤狀態,它不能讀取任何其他東西(如果你輸入的話會發生同樣的情況,例如「cat」而不是數字)。驗證輸入的* safe *方法是將所有內容作爲字符串讀取,然後檢查它,然後在驗證通過時將其轉換爲最終類型('int'等)。 – Cameron 2014-11-20 21:10:20

+0

請發佈[MCVE](http://stackoverflow.com/help/mcve)。 – 2014-11-20 21:14:19

回答

3

我的猜測是你要經過int的最大範圍。如果您輸入的號碼高於2,147,483,647,這很可能是因爲您需要10個號碼。嘗試使用很長時間。

int numberOfDigits(long long num) 
{ 
    long long d = 0; 

    while (num > 0) 
    { 
     num /= 10; 
     d++; 
    } 

    return d; 
} 

我剛試過,它對我來說工作正常。全部節目,我用來測試:(!numberOfDigits(數)= 10)

using namespace std; 

int numberOfDigits(long long num) 
{ 
    long long d = 0; 

    while (num > 0) 
    { 
     num /= 10; 
     d++; 
    } 

    return d; 
} 

int main() 
{ 
    long long number = 0; 
    do 
    { 
     cout<<"Enter a 10-digit number: "<<endl; 
     cin>>number; 
    } 
    while (numberOfDigits(number) != 10); 
    return 1; 
} 
+2

@Grice,他輸入10 *位*,所以任何以3開頭的10位數字都會溢出整數。 – aquinas 2014-11-20 21:12:03

+0

downvote的解釋請嗎? – marsh 2014-11-20 21:13:01

+1

是的,當我輸入大多數時間以1或2開頭的數字時,它確實有效,但是對於更大的值,它會崩潰。我改變了很久,現在它工作正常。沒有考慮類型的範圍......謝謝你們! – 2014-11-20 21:13:29

0

如果更改

而(numberOfDigits(數)< = 10)

這樣,它將繼續執行do-while循環,直到用戶選擇一個小於或等於的數字爲止。