2013-12-23 2 views
-3

Мы попытались найти эту проблему, но мы не нашли ответы. Если пользователь вводит строковую переменную, когда системе требуется целое число, как вы избегаете проблемы с использованием цикла while?пользователь вводит String вместо Int

{ 

    int grade_var=0,grade_1=0,sum=0; 

    cout<<"Enter the number of grades you have:\t"; 


    cin>>grade_var; 


    for(int i=1;i<=grade_var;i++) 

Я не хочу, чтобы сделать петлю, а для моей программы есть много целых вставки и хочет знать, более простой способ, чтобы исправить, а не в то время как петли?

+1

точно как вы «вернетесь» к коду «получить ввод», если введены плохие данные, БЕЗ петли? Вы можете просто вложить 'if (input is bad) {получить больше ввода {if (input is bad) {....}}' так глубоко, как вы хотите. но если вы проверите 'n' раз для плохих входов, кто-то будет вводить плохие вещи' n + 1' раз и обходить вашу проверку. Цикл намного проще. 'while (вход плохой) {get input}' is –

+1

@MarcB: более уместно, 'do {ask input} while (input is bad)'. – usr2564301

+0

Единственное решение, которое не включает в себя циклы, о которых я могу думать, помещает ваш вход в вспомогательную функцию и использует рекурсию: 'if (inputisbad) readinput()' – yizzlez

ответ

2

В то время как петли - это, как правило, путь.

Однако, чтобы сохранить код в чистоте, вы можете захотеть поместить указанный цикл while в вспомогательную функцию, чтобы вы могли просто вызвать PollForIntegerInput (строковое приглашение) из любого места вашего кода, а затем обработать этот ввод в одном месте , Существует почти никогда не причина, по которой вы должны дублировать входной цикл таким образом.

Что касается действительно непонятного ответа, у меня его нет.

2

Вызов operator>> на поток возвращает сам поток, который может быть преобразован в bool, чтобы проверить, если поток находится в хорошем состоянии. Если происходит плохая добыча, поток не находится в хорошем состоянии. Таким образом, вы можете сделать что-то вроде этого:

if (cin >> grade_var) 

Это проверит, что это было успешно. Вы можете просто отрицать условие, чтобы найти его, если оно не было успешным. Как вы справляетесь с этим условием. Может быть, вы нанесете ошибку return. Однако, если вы хотите повторно запросить пользователя для правильного ввода, вам понадобится цикл.

1

Это не слишком ясно, что ваша проблема, но ...

Это почти всегда плохой дизайн для ввода количество данных точек, которые будут следовать. Если вы планируете серию int, для например:

std::vector<int> grades; 
int grade; 
while (std::cin >> grade) { 
    grades.push_back(grade); 
} 

Это не становится намного проще.

Если вы хотите, чтобы настаивать на точном количестве ввода, вывода об ошибке, когда пользователь вводит что-то неправильное, обычная картина будет:

std::vector<int> grades; 
while (grades.size() != targetNumber) { 
    int grade; 
    while (!(std::cin >> grade)) { 
     std::cout << "Integer wanted" << std::endl; 
     std::cin.clear(); 
     std::cin.ignore(INT_MAX, '\n'); 
    } 
    grades.push_back(grade); 
} 

Еще нет for. (Фактически, for петли с входом очень, очень редкий.)

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