2014-11-20 148 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循环,直到用户选择一个小于或等于的数字为止。