Почему пробел не действует как разделитель при печати строк с оператором ostream <<? - PullRequest
1 голос
/ 12 июня 2011

Я знаю, что при написании кода типа std::cin >> some_var;, где some_var - строковая переменная, только первое введенное слово будет сохранено в some_var.Но я не понимаю, почему std::cout << "something here"; не только выводит «что-то».Я что-то пропустил?

Ответы [ 6 ]

6 голосов
/ 12 июня 2011

При чтении ввода с использованием cin >> some_var, по умолчанию используется разделитель пробел (хотя вы можете изменить ), а при печати cout печатает до тех пор, пока не найдет \0 который является концом строки.

Если вы хотите читать, пока он не найдет \0 во входном потоке, то вы должны написать это:

std::getline(std::cin, some_var, '\0');

В качестве третьего аргумента функции std::getline можно указать любой другой символ в виде разделитель .

Обратите внимание, что есть функция-член с таким же именем getline, которая немного отличается от той, которую я использовал выше, и является бесплатной автономной функцией.

Сравните:

  • std :: getline - бесплатная автономная функция. Также доступна перегруженная функция.
  • istream :: getline - функция-член std::istream

Я использовал первый.

4 голосов
/ 12 июня 2011

Было сочтено полезным, чтобы cin при чтении в string заканчивалось пробелами. Но было сочтено бесполезным, что при печати строки печатается только первое слово.

После всего, что вы сказали напечатать "что-то здесь", чтобы набрать · В другом случае вы просто сказали прочитать что-то из cin. Выбор между словом, между строкой и между всем содержимым stdin (до тех пор, пока не будет получен EOF) является произвольным, и дизайн, по-видимому, заключается в чтении слова. Это облегчает быстрое чтение строки записи, такой как «john 10 2.15» (сначала чтение в строку, затем в int, а затем в float). Используйте std::getline, чтобы прочитать всю строку в string.

3 голосов
/ 12 июня 2011

Потому что, когда вы принимаете входные данные от std::cin, необходимо знать, когда останавливать входные данные.Если оно не остановилось на первом слове, то когда остановится на ?Однако, когда вы выводите переменную, ответ прост - вы выводите эту переменную.

2 голосов
/ 12 июня 2011

Да ... cin останавливается на пробеле, потому что, по умолчанию, он думает, что вы хотите слово.cout не следует тому же ограничению, потому что, ну, зачем это?Подумайте об этом на секунду - будет ли это вообще иметь смысл, если распечатать «Привет, мир!»на самом деле просто распечатал "Привет"?Конечно, это не имеет никакого смысла.Разработчик знает, что они хотят вывести (по крайней мере, мы надеемся: D).

1 голос
/ 12 июня 2011

Я думаю, что они взяли соглашение и придерживаются его. В случае << ясно, что вы указываете, что должно быть написано. В случае >> они должны решить, где остановиться. Новая линия? Может быть, это самая естественная альтернатива, но они просто решили прекратить чтение в космосе.

0 голосов
/ 12 июня 2011

Разделители различны для cin и cout. Для cin вход разделяется на пробелы, для cout в конце строк. Вы можете изменить эти разделители по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...