Возникли проблемы с вводом в приложении командной строки - PullRequest
0 голосов
/ 27 января 2012
#include "ellison.h"

int main(int argc, char *argv[])
{
    if (argc > 1)
    {
        int errorOutput = Execute(argc, argv);
        switch (errorOutput)
        {
            case 0:
                return EXIT_SUCCESS;
                break;
            default:
                cout << "An error occured: " << ParseError(errorOutput);
                return ERROR;
                break;
        }
    }

    cout << "+---------------+  \n";
    cout << "| ellison 0.1.1 |  \n";
    cout << "+---------------+  \n\n";

    int errorOutput = 0;
    string input;

    while (true)
    {
        cout << ">";
        input = "";
        cin >> input;

        if (input == "quit")
        {
            if (errorOutput != 0)
                return ERROR;
            else
                return EXIT_SUCCESS;
        }

        errorOutput = Execute(input);
        switch (errorOutput)
        {
            case 0:
                break;
            default:
                cout << "An error occured: " << ParseError(errorOutput);
                break;
        }
    }
}

Этот код компилируется и работает нормально. Странно то, что если я наберу длинную строку букв с одним или несколькими пробелами, у меня будет два знака больше, чем один. Есть какая-то ошибка, которую я сделал? Я добавлю, что это не работает с короткими строками ввода, и что это было скомпилировано с Visual-C ++ 2012

1 Ответ

0 голосов
/ 27 января 2012

std :: cin читает только до первого пробела.Затем он не очищает буфер чтения.Итак, из-за вашего «while (true)», когда он попадает во второй std :: cin, он читает вторую часть вашего ввода, не ожидая нового ввода.Вместо этого вы должны попробовать std :: getline (stream & readingBuffer, std :: string & destination).Он будет читать всю строку примерно так:

getline(cin, input);

Только не используйте cin и getline одновременно, если только вы не используете cin.ignore (1) после использования cin, потому что cin оставляет символ '/н 'в потоке.Если вы используете getline сразу после этого в том же потоке, он остановится на этом '/ n', не читая то, что вы хотели прочитать.

...