Как заставить .getline получать ответы за каждый раз через - PullRequest
1 голос
/ 17 октября 2011

Я младший программист, возможно, плохой код, который вы, компьютерные эксперты, сможете найти.Я сделал это для запоминания программы абзаца для своего собственного использования. Можете ли вы найти способ, чтобы getline происходил каждый раз во время работы?Вот мой код ...

#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;

void main(){
    string sentence;
    string attempt;
    char key;
    int counter = 0;

    cout << "Insert your sentence / paragraph (will be case sensitive) (don't press     enter until you're done)." << endl << endl;
    getline (cin, sentence);
    cout << endl;
    while (true){
        system ("cls");
        Sleep (5);
        cout << "Now enter the sentence / paragraph" << endl;
            getline (cin, attempt);
        if (sentence == attempt){
            cout << "Good job, do you want to go again? N for no, anything else for     yes" << endl;
            cin >> key;
            if (key == 'n' || key == 'N'){
                break;
            }
        }
        else{
            cout << "You messed up, try again." << endl;
            system("pause");
            continue;
        }
    }
    system("pause");

}

1 Ответ

0 голосов
/ 17 октября 2011

Не пройдя весь ваш код.Вероятно, что байты остаются во входном буфере после вызова getline().Я объясню с помощью ASCII art.

Скажем, ваш буфер выглядит следующим образом, где каждое пустое поле может содержать байт.

|_|_|_|_|_|...|_|

Когда вы вводите фразу(например, «FOO») и нажмите Enter, буфер выглядит следующим образом:

|F|O|O|\n|_||_|...|_|

Символ '\n' (символ новой строки) добавляется клавишей Enter.

Когда getline() читает через буфер, он читает, пока не достигнет символа новой строки, но не удаляет его.Таким образом, вызов выглядит следующим образом:

getline(cin, str) // = "FOO"
|\n|_|_|...|_| // buffer after call

Следующий вызов getline() будет читать в новой строке (и удалять его из буфера).

getline(cin, str) // = "\n"
|_|_|_|_|_|...|_| // buffer after call

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

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

после каждого чтения буфера.Это также помогает определить это как макрос или встроенную функцию, чтобы быстро вызывать ее в любое время.

...