Моя задача состоит в том, чтобы создать вектор строк, добавить к нему строки и удалить из него строки. У меня проблемы с добавлением строк. Я также настроил их так, чтобы регистр коммутатора давал возможность добавлять очередь в случае 1.
//gaming Queue
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
int choice;
string input;
bool menu = true;
vector<string> favGames;
while (menu){
cout <<"Welcome to the favorite game queue please add your favorite games:\n";
cout <<"1-Add a favorite game.\n";
cout <<"2-List of your favorite games.\n";
cout <<"3-Remove a game.\n";
cin >> choice;
switch (choice)
{
case 1:
cout << "Please add a favorite game to the queue: \n";
string input;
cin >> input;
favGames.push_back(input);// Here is my problem it just jumps to case 2 and shows an error
break;
case 2:
cout << "Here is a list of your favorite games.\n";
break;
default:
cout << "You made an illegal choice.\n";
}
}
return 0;
}
При компиляции вашего кода на https://www.onlinegdb.com/online_c++_compiler, это показывает мне эти ошибки:
main.cpp:34:18: error: jump to case label [-fpermissive]
case 2:
^
main.cpp:30:24: note: crosses initialization of 'std::string input'
string input;
как вы можете видеть, компилятор говорит вам, что вы пропускаете инициализацию string input
, В то же время вы декларируете input
второй раз.
Удаляя input
Внутри корпуса коммутатора программа компилируется и работает как задумано.
РЕДАКТИРОВАТЬ:
Вы не можете ввести более одного слова, используя cin, потому что cin
Извлечение всегда рассматривает пробелы (пробелы, табуляции, новую строку …) как завершение извлекаемого значения.
Так что вы должны использовать getline
, То же самое для получения choice
,
вот полный код:
#include "stdafx.h"#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
int choice;
string input;
bool menu = true;
vector<string> favGames;
while (menu) {
cout << "Welcome to the favorite game queue please add your favorite games:\n";
cout << "1-Add a favorite game.\n";
cout << "2-List of your favorite games.\n";
cout << "3-Remove a game.\n";
string choiceStr;
getline(cin, choiceStr);
stringstream(choiceStr) >> choice;
switch (choice)
{
case 1:
cout << "Please add a favorite game to the queue: \n";
getline(cin, input);
favGames.push_back(input);
break;
case 2:
cout << "Here is a list of your favorite games.\n";
break;
case 3:
cout << "No longer like a game which game should we remove?\n";
break;
default:
cout << "You made an illegal choice.\n";
}
}
return 0;
}
Причина, по которой он входит в бесконечный цикл:
cin >> input
может работать только при вводе только одного слова. Если вы введете несколько слов, cin >> input
поймает первый, то cin >> choice
поймать следующий. Если вход поймать cin >> choice
это не int, cin
потерпит неудачу, что делает вас бесконечным циклом в этом случае.
Здесь объясняется http://www.cplusplus.com/doc/tutorial/basic_io/.
switch
заявления немного странные, потому что вы не можете объявить переменные внутри case
пункты, если вы не создаете область для них, используя {}
блок.
switch (choice)
{
case 1:
{ // start a scope
cout << "Please add a favorite game to the queue: \n";
string input;
cin >> input;
favGames.push_back(input);// Here is my problem it just jumps to case 2 and shows an error
break;
} // end the scope
Однако в вашем случае вы уже определили std::string
вне switch
Вы собирались использовать это? Тогда вы можете просто удалить один внутри case
пункт.