Я знаю, что это слишком известный вопрос, но я не могу найти ответОчистка входного потока
Я имею л так:
while (true) {
std::cout << "\nCommand> ";
std::cin.get(input, MAX, '\n');
std::string cmdtemp = input;
std::string token;
std::istringstream issc(cmdtemp);
std::string cmd[MAX];
while (getline(issc, token, ' '))
{
cmd[b] = token;
b++;
}
if (cmd[0] == "help") {
Help cmd(cmd);
std::cin.ignore(100, '\n') ;
}
else if (cmd[0] == "modify")
Command* cmd = new Modify;
std::cin.ignore(100, '\n') ;
else if (cmd[0] == "convert")
Command* cmd = new Convert;
std::cin.ignore(100, '\n') ;
else if (cmd[0] == "show")
Command* cmd = new Show;
std::cin.ignore(100, '\n') ;
else if (cmd[0] == "getrates")
Command* cmd = new Getrates;
std::cin.ignore(100, '\n') ;
else {
std::cout << "Wrong command. Type help for Help.";
std::cin.ignore(100, '\n') ;
}
После второго входа, это становится бесконечный цикл (хотя поток должен быть очищен даже после второго ввода, я прав?), также, если я, например, дважды вхожу в «помощь», первый работает, а второй не
Что я могу сделать, чтобы получить пользователя правильно ввести столько раз, сколько пожелаете?
EDIT: Когда пользователь вводит одну из команд (если еще ...), объект создается и запускается конструктор. В случае «help» конструктор отображает список команд с пояснениями. Это работает только один раз в моем случае. Когда я вхожу в «help», конструктор работает, но когда я снова вхожу в «help», он отображает бесконечно много «неправильной команды» (иначе условие в my if else). Это из-за потока, я думаю, но я, хотя cin.ignore (...) должен очистить и код должен работать. Надеюсь, что это объяснение достаточно :)
Заранее спасибо :)
Какое поведение вы хотите? Ваш код не ясен, и ваши объяснения не помогают. Какое поведение вы хотите, точнее, более четко определить «ввод правильно» и «столько раз» ... Просто мысль, «хотя (правда)» без «перерыва» - это почти всегда плохая идея. – ChrisCM
Возможно, вы хотели использовать 'while (issc >> token)'? Это будет читать все строки на входе, разделенные любым пробелом. Я полагаю, что ваша проблема со второй командой заключается в том, что вы нажимаете enter на клавиатуре, но ваш код ожидает найти пространство в качестве разделителя команд. – jcxz