Странная ситуация с зацикливанием, не знаю, в чем причина

Возникли проблемы с некоторым кодом, и я не могу докопаться до сути. Этот код:

int main()
{
int choice;

while (choice != -1)
{
      system("cls");
      std::cout << "Main Menu: " << std::endl
                << " 1. Encode." << std::endl
                << " 2. Decode." << std::endl
                << "-1 to exit." << std::endl;

      std::cin >> choice;

      switch (choice)
      {
             case 1:
                  encode();
                  break;
             case 2:
                  decode();
                  break;
             case -1:
                  break;
      }
}

getchar();
return 0;

}

void encode()
{
 std::string plainText;
 std::string encText = "Test";

 std::cout << "Enter text to be encrypted.\n";

 getline(std::cin, plainText);

 for (int x = 0; x < plainText.length(); x++)
 {
     //encText += plainText.substr(x, x + 1);
 }

 std::cout << encText;
 getchar();

 return;
}

Если я ввожу '1' при первом выборе cin >>, я захожу в encode(), после чего ввод любого текста заставляет программу вернуться к while, выполнить system("cls"), а затем сразу вернуться назад на «Введите текст для шифрования». вниз в кодировании().

Любая помощь? Я не знаю.


person Kefkamaydie    schedule 06.02.2013    source источник
comment
Любой из них: stackoverflow.com/search?q=getline+skipping   -  person chris    schedule 06.02.2013
comment
В чем смысл getchar() в конце encode()?   -  person Arun    schedule 06.02.2013
comment
@kefkamaydie: Вот загадка :-), что произойдет, если пользователь решит ввести «0» в качестве варианта ввода? Подумай об этом :-)   -  person Arun    schedule 06.02.2013
comment
Спасибо, парни. Ответ действительно был предоставлен в другом вопросе!   -  person Kefkamaydie    schedule 06.02.2013
comment
Смысл getchar() в конце кодирования заключался в том, чтобы не допустить запуска системы (cls) до того, как я увижу, был ли введен ввод.   -  person Kefkamaydie    schedule 06.02.2013
comment
Я думаю, что Арун Саха понял это. Если вы введете -1, знак - будет съеден вызовом getchar(), так что двухбуквенная запись будет обработана как 1 основным циклом и вызывается encode().   -  person Bob Murphy    schedule 06.02.2013


Ответы (1)


Если вы хотите выйти из цикла while после encode() или decode(), вы должны выполнить условие while. Вы можете сделать это, просто установив choice в -1 после вызова функции:

         case 1:
              encode();
              choice = -1;
              break;
         case 2:
              decode();
              choice = -1;
              break;

Чтобы вы знали, return в конце encode() приводит к завершению функции encode(), а не main. Эта строка кода на самом деле ничего не делает; так как после этого ничего нет, это все равно произойдет.

person Foggzie    schedule 06.02.2013