2014-11-07 1 views
5

Я работаю в школьном задании и сейчас избиваю голову против стены, пытаясь понять, почему моя программа не ведет себя так, как мне бы хотелось!Проблемы на C++, связанные с getline() и петлей

int main(){ 
    string input; 
    char choice; 

    bool getChoice(char); 
    string getInput(); 

    CharConverter newInput; 

    do{ 
     cout << "Please enter a sentence.\n"; 
     getline(cin, input); 

     cout << newInput.properWords(input) << endl; 

     cout << newInput.uppercase(input) << endl; 
     cout << "Would you like to do that again?\n"; 
     cin >> choice; 



    } while (getChoice(choice) == true); 

    return 0; 
} 

Эта программа отлично работает на первом круге, но у меня возникают проблемы, когда getChoice() == верно, и делать в то время как блок петельные во второй раз. Во втором цикле программа просит меня снова ввести предложение, но затем просто перескакивает на «Хотите сделать это снова?» без ввода пользователем или вывода результатов правильных функций word() и uppercase(). Я подозреваю, что есть что-то о getline, которые я не понимаю, но мне еще предстоит найти его в моем поиске. Любая помощь там?

изменение: произошла ошибка в моем первоначальном объяснении.

+0

Какой вклад вы используете? Если в вашем входном потоке имеется более одной строки, getline() будет захватывать следующую строку, не дожидаясь большего ввода. – Otaia

+0

В основном, что я пытаюсь сделать, это позволить пользователю ввести полное предложение, которое передается двум функциям-членам. Я хочу, чтобы пользователь мог ввести новое предложение на следующей итерации ... и так далее. – user3468711

+1

Мне нравится этот вопрос, потому что string vs. char input - это одна из вещей, которая вызывает множество людей, когда они сначала начинают кодирование на C/C++ (или на многих других языках, если на то пошло). –

ответ

5

Это потому, что чтение ввода с getline не очень хорошо смешивается с чтением ввода посимвола. Когда вы вводите символ Y/N, чтобы указать, хотите ли вы продолжить или нет, нажмите . Введите. Это помещает \n во входной буфер, но >> не берет его оттуда. Когда вы вызываете getline, \n находится прямо там, поэтому функция возвращает пустую строку сразу.

Чтобы это исправить, сделать choicestd::string, используйте getline, чтобы прочитать его, и отправить первый символ getChoice функции, например:

string choice; 
... 
do { 
    ... 
    do { 
     getline(cin, choice); 
    } while (choice.size() == 0); 
} while (getChoice(choice[0])); 
+0

Отлично! Вы просто сделали мой день. – user3468711

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