2014-11-20 4 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 на длинный – marsh

+2

'int' обычно 32 бит в ширину; 32-разрядное (подписанное) целое число может содержать только до 2 ** 31 или чуть более 2 миллиардов, что уже равно 10 цифрам. Что-то большее, чем это не вписывается в int, а 'cin' вводит состояние ошибки, где он не может читать что-либо еще (то же самое произойдет, если вы наберете, например,« cat », а не число). * Безопасный * способ проверки ввода - читать все как строку, затем проверять его, а затем преобразовывать в окончательный тип ('int' и т. Д.), Если проверка прошла. – Cameron

+0

Отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). –

ответ

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 * цифр *, поэтому любое 10-значное число, которое начинается с 3, например, переполнило бы int. – aquinas

+0

Объяснение downvote, пожалуйста? – marsh

+1

Да, он работает, когда я ввожу число, которое начинается с 1 или 2 в большинстве случаев, но для больших значений он сбой. Я изменил его на долгое время, и теперь он отлично работает. Не думал о диапазоне типов ... Спасибо, ребята! –

0

Если вы изменили

в то время как

к

в то время как (numberOfDigits (число) < = 10)

Таким образом, он продолжит цикл do-while, пока пользователь не выберет число, которое меньше или равно.

Смежные вопросы