2013-11-30 2 views
2

Я создаю продукт для проверки продукта, и я продолжаю сталкиваться с странной ошибкой. У меня есть центральное меню, которое вводит пользователя. После того, как функция завершит свою задачу, она возвращает пользователя обратно в меню. Однако для некоторых функций cin.get() у меня появляется после ошибок меню, и не будет принимать первую указанную команду. Вот соответствующие фрагменты кода:Нужна помощь в исправлении странного поведения cin

Основной цикл меню:

bool foreverLoopFlag = true; 
while (foreverLoopFlag) { 

    cout << "\nC[heckout], R[eturn], S[tudent], P[roduct], Q[uit]. Choice? "; 
    cin.get(actionChoice); 
    std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 
    cout << endl; 

    actionChoice = toupper(actionChoice); 

    switch (actionChoice) { 
     case 'C': 
      checkoutSoftware(studentMap, productList); 
      break; 
     case 'R': 
      returnSoftware(studentMap, productList); 
      break; 
     case 'S': 
      studentDisplay(studentMap, productList); 
      break; 
     case 'P': 
      productDisplay(studentMap, productList); 
      break; 
     case 'Q': 
      foreverLoopFlag = false; 
      break; 
     default: 
      cout << "Invalid command.\n"; 
      break; 
    } 
} 

функция проблем ребенка, studentDisplay:

void studentDisplay(map<string, Student> & studentMap, list<Product> & productList) { 
string inputCLID; 

cout << "Please enter student CLID: "; 
cin >> inputCLID; 

if (studentMap.find(inputCLID) != studentMap.end()) { 
    cout << "\nStudent: " << studentMap[inputCLID].name << " (" << inputCLID << ")\n"; 
    cout << "\tBorrowed items: " << endl; 
    for (list<Student::LentProduct>::iterator it = studentMap[inputCLID].checkedOut.begin(); 
     it != studentMap[inputCLID].checkedOut.end(); it++) { 
     cout << "\t\tProduct: " << (*it).name; 
     cout << "\tDue Date: " << (*it).dateDue << endl; 
    } 


} else { 
    cout << "\nError: CLID not in database.\n"; 
} 
} 

Некоторые из отступа было искажено движется к SE, я принести извинения. Вот пример меня вопрос:

C[heckout], R[eturn], S[tudent], P[roduct], Q[uit]. Choice? s 

Please enter student CLID: mrx8394 

Student: Mark Xeno (mrx8394) 
    Borrowed items: 
     Product: Bluebeard Due Date: 12/14/2013 

C[heckout], R[eturn], S[tudent], P[roduct], Q[uit]. Choice? c 

Invalid command. 

C[heckout], R[eturn], S[tudent], P[roduct], Q[uit]. Choice? q 

Я попытался положить зЬй :: cin.flush() в начале меню петли, но это не сработало. Я попытался сделать std :: cin.ignore (std :: INT_MAX) в начале цикла меню, но это делает так, что меню никогда не появляется. Я также попытался зЬй :: cin.sync(), но это только делает бесконечный цикл этого:

C[heckout], R[eturn], S[tudent], P[roduct], Q[uit]. Choice? 
Please enter a product to checkout: 
Error: No such product. 

Я понятия не имею, куда идти отсюда. Я знаю, что это, вероятно, просто какая-то причуда iostream, которую я не собираю. Любой помощник будет оценен по достоинству.

EDIT: У меня нет достаточной репутации, чтобы продвигать или комментировать конкретные ответы (все мои ревью на Math.SE !!!), поэтому я прокомментирую здесь. Решение Игоря-Тандетника отлично работало. Я переместил все остальное на линию, но я предполагаю, что этот парень просто остался в тасовании. Моя благодарность приходит толпами.

@qwrrty Хотя это может быть глупость, у меня была спецификация, чтобы встретиться (не просто любите курсы низкого уровня). Обычно я не прошу помочь отладку заданий, но это была последняя ошибка, и мои знания об iostream не так глубоки, но я знал, что кто-то здесь знает, что искажает состояние моего потока.

Еще раз спасибо ребятам, приветствую!

ответ

1

cin >> inputCLID считывает символы до первого символа пробела, но не включая его (в вашем примере, строка). Этот символ остается в потоке. Это тот символ, который получает cin.get(actionChoice).

0

Я склонен думать, что для интерактивного ввода, пытаясь использовать stdin и/или cin для чтения ничего, кроме полной строки ввода, является глупостью. Слишком много способов для вашей программы запутаться в том, что все еще присутствует в потоке ввода, и в конечном итоге находится в состоянии, не подлежащем восстановлению.

По крайней мере, я бы изменить программу, чтобы сказать, что команды он считает недействительным, или продукт, который не существует:

default: 
     cout << "Invalid command '" << actionChoice << "'\n"; 

и

cout << "Error: No such product '" << productChoice << "'\n"; 

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

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