Странное C ++ входное экранирование и пробел - PullRequest
1 голос
/ 19 июня 2010

У меня неприятная проблема с примером C ++.Все работает нормально, пока я не введу что-то с пробелами.

#include <iostream>
using namespace std;

int main (int argc, char * const argv[])
{
    int iteration = 0;
    while (true) {
        char * input = new char[256];
        scanf("%s", input);
        cout << ++iteration << ": " << input << endl;
        cin.get();
    }
    return 0;
}

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

foo
1: foo
bar
2: bar
foobar
3: foobar
foo bar
4: foo
5: bar

Каждая функция чтения входных данных действует так, и это сводит меня с ума.cin >> input, freads(), cin.get() и т. Д. Все это делают.

Это частая проблема с пользовательским вводом, или я что-то здесь не так делаю?

Ответы [ 3 ]

4 голосов
/ 19 июня 2010

Прежде всего, никогда не используйте scanf. Трудно использовать эту функцию и избежать переполнения буфера. Замените input на std::string и прочитайте из std::cin.

И scanf("%s", input), и cin >> input будут читать одно слово, разделенное пробелом. Если вы хотите прочитать всю строку, используйте getline(cin, input).

1 голос
/ 19 июня 2010

Может быть, вместо этого попробуйте использовать std :: getline?http://www.cplusplus.com/reference/string/getline/

1 голос
/ 19 июня 2010

О scanf %s спецификатор формата :

Это будет читать последующие символы до тех пор, пока не будут найдены пробелы (пробелы считаются пустыми, перевод строки и табуляция).

О istream::operator>> с параметром str :

Извлечение заканчивается, когда следующий символ является допустимым пробелом или нулевым символом, или если достигнут конец файла.

Так что да, это стандартное поведение для этих функций.

...