2015-01-13 3 views
-2

У меня есть меню, в котором пользователю необходимо вводить число от 1 до 5, в любое время, когда пользователь вводит числовое значение, которое он отлично работает, он либо перейдет к указанному случаю, либо в случае неверная цифра, она перейдет к умолчанию и появится сообщение об ошибке.Переключение/остановка без перерыва

Теперь моя проблема в том, что пользователь вводит букву алфавита, программа продолжает цикл и цикл, она не останавливается при каждом переходе по умолчанию.

Я пробовал много вещей! Использование оператора if для проверки того, является ли число 1 < = значение < = 5, не работает. Я пробовал жесткое кодирование в числе, если вход не находится между этими значениями, он все равно петли навсегда. Я пробовал делать cim.good(), не уверен, правильно ли я сделал это, но способ, которым я это сделал, не работает. Я также пытался использовать функцию isdigit(), но та же проблема, она не работает ... Я действительно не знаю, что я должен делать. Вот что я (упрощен).

int menu() 
{ 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    cin >> key; 

    return(key); 
}` 

void main() 
{ 
    Menu: 
      key = menu(); 

      switch(key) 
      { 
      case 1: 
       goto Menu; 
      case 2: 
       goto Menu; 
      case 3: 
       goto Menu; 
      case 4: 
       goto Menu; 
      case 5: 
       break; 
      default: 
       cout << endl << "Invalid entry, please try again" << endl; 
       goto Menu; 
      } 
} 

Я удалил то, что находится внутри корпусов, чтобы оно выглядело лучше. Когда я набираю ключ, я продолжаю получать сообщение «Неверная запись, пожалуйста, попробуйте еще раз», так что это происходит.

EDIT: Хорошо, я прошу прощения за «goto», не знал, что это хмурится, все еще учась! Спасибо всем за помощь. Я обязательно их удалю.

+4

'goto'? в C++? орел? http://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto – Jack

+4

Избегайте 'goto', если это не упростит понимание. Совет. Это означает, что эксперт может использовать его один раз в десятилетие или такой ... – Deduplicator

+0

«Я пробовал делать cim.good(), не уверен, что я сделал все правильно, но способ, которым я это сделал, не работает». Пожалуйста, постарайтесь дать более подробную информацию о том, что вы сделали в следующий раз, поэтому мы можем попытаться дать вам некоторые конкретные подсказки для ваших ошибок. – LiKao

ответ

1

Вместо того, с помощью goto, я предлагаю вам использовать простой do {} while цикл вроде

#include <iostream> 

using namespace std; 

int menu() { 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    cin >> key; 

    return(key); 
} 

int main(int argc, char *argv[]) { 
     int key; 
     do { 
       key = menu(); 
     } while (key < 1 || key > 5); 
     cout << key << endl; 
} 

Какие петли в то время какkey < 1 или key > 5.

+0

Я никогда не видел аргументов, используемых в main(), что делают argc и argv? Я не знал, что goto хмурится, однако для меня эти простые goto выглядят намного опрятными и легче следовать, чем это (вероятно, потому, что я не понимаю). Но как работает этот код? – Maty

+0

@Maty Они не имеют отношения к вашему делу и, во всяком случае, необязательны. Многие программисты просто используют его из фрагмента кода шаблона, независимо от того, используются ли эти параметры или нет. –

+0

AH, ОК. Я сделаю свое исследование функции do {} и посмотрю, как это работает. Но последний вопрос здесь, случаев нет, так как он знает, куда идти? Или Эллиотт просто оставил эту часть, и дела идут внутрь? – Maty

1

Посмотрите на this posting из C++ FAQ lite и this posting.

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

Вы должны очистить состояние с помощью cin.clear(), а затем игнорировать остальную часть буфера (до конца строки) с помощью cin.ignore(INT_MAX, '\n')

Так что ваш метод стал бы:

int menu() { 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    while(cin >> key) { // same as querying cin.good() 
     cout << "Not a number" << endl; 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); 
    } 

    return(key); 
} 
+0

Я сделал один тест, где у меня было утверждение if, которое проверено, если cin.good() недействителен. И когда я помещаю символ, я предположил, что это не так (как вы упомянули), и поэтому я жестко закодировал ключевое значение там (внутри оператора if), key = 6, которое должно было очистить его? Или нет? – Maty

+1

@Maty: Не уверен, что вы подразумеваете под своим комментарием. Пожалуйста, отправьте код того, что вы пытались изменить, на свой вопрос. Реальный код дает лучшее представление о том, что вы пробовали. – LiKao

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