2013-09-20 3 views
1
int main() 
{ 
    unsigned short wC; 

    while(1) 
    { 
    cout << "Enter the Value"<<endl; 
    cin >> wC; 
    if(wC < 0 || wC > 3) 
    { 
     cout << "Wrong value, Please Enter again" << endl; 
    } 
    else break; 
    }// end of while 

    cout << "The value is : " << wC << endl; 
}//end of main 

В приведенном выше коде, когда я даю значение в диапазоне коротких 0xffff, он отлично работает. И выходит из цикла и печатает значение только тогда, когда пользователь дал значение для wC в диапазоне от 0 до 3, в противном случае приглашение ввести Enter снова и ждать ввода пользователя.Почему я получаю бесконечный цикл?

Но если значение, введенное для wC, составляет более 0xffff, то оно переходит к бесконечной петле.

Я думаю, что из-за значения все еще существуют входные данные cin буфер или что? Пожалуйста, помогите и предложите какое-либо решение (подсказку), чтобы оно работало.

ПРИМЕЧАНИЕ. Пользователь может предоставить любое целочисленное значение. код должен отфильтровать его. Использования g++ компилятора Ubuntu/Linux ... и sizeof(unsigned short int) = 2 bytes

+1

Это потому, что 'cin' находится в плохом состоянии после ошибки и не получит никакого ввода, пока вы не очистите плохой бит. –

+1

Поскольку 'wC' не имеет знака, он никогда не может быть меньше нуля, поэтому для этого нет точки проверки. –

ответ

2

Если вход не удается, либо из-за того, что вы ввели не является целым вообще или потому, что он переполняется или недостаточным типа цели, cin переходит в состояние ошибки (cin.good() возвращается false), и любая дальнейшая операция чтения не является операцией. Положите вызовы на cin.ignore (чтобы удалить оставшийся вход) и cin.clear (чтобы сбросить флаги ошибок) в цикл.

Даже тогда вы все равно можете столкнуться с проблемой, если пользователь вводит EOF (Ctrl + D в Unix, Ctrl + Z в Windows). Вам нужна ваша петля, чтобы понять эту часть и вырваться.

#include <iostream> 
#include <limits> 
using namespace std; 
int main() { 
    unsigned short value; 
    cout << "Enter the value (0-3):" << endl; 
    while(true) { 
    cin >> value; 
    if (!cin || value < 0 || value > 3) { 
     if (cin.eof()) { 
     cout << "End of input, terminating." << endl; 
     return 0; 
     } 
     cout << "Bad input, try again (0-3):" << endl; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
    } 
    cout << "The value is: " << value << endl; 
} 

Конечно, это один адский код, просто для ввода одного номера. Вы можете практиковать подходящие интерфейсы, пытаясь написать функцию, которая занимается этим материалом для вас.

+0

эй, спасибо +1, не могли бы вы рассказать немного. который будет лучше использовать .. 'ignore' или' clear' – Omkant

+0

игнорировать также не работает. но четкие работы. – Omkant

+0

@Omkant вам нужно будет называть 'clear' * и *' ignore'; 'ignore' не очищает флаги ошибок. – Simple

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