Следующий код сделан:
#include <string>
#include <iostream>
using namespace std;
int main() {
string s;
while(true) {
cin >> s;
cout << "type : " << s << endl;
}
}
Вывод консоли:
ВХОД: usa americ england gana
ВЫХОД:
type : usa
type : americ
type : england
type : gana
ВХОД: hello world
ВЫХОД:
type : hello
type : world
Всякий раз, когда я набираю «usa americ englend gana» и затем вводу, он отображает каждую строку, введенную через cin, в блоке while.
Есть ли причина для этого? Как «поток буферизируется»?
Как я могу сделать так, чтобы при вводе нескольких строк через cin пробелы не разделялись? Есть ли какая-то конкретная функция или ответ на эту проблему?
Один звонок operator>>
из std::cin
читает только до первого пробела. Когда вы вводите 4 слова в одну строку, ваш std::cin
читает первое слово, принимает его, и выполнение продолжается. Но остальные 3 слова все еще ожидают чтения во входном потоке, и они будут прочитаны при следующем вызове operator >>
,
Итак, чтобы проиллюстрировать, что происходит, вот пример:
Input stream content: [nothing]
//(type usa americ england gana)
Input stream content: usa americ england gana
//cin >> s;
s == "usa"Input stream content: americ england gana
//cin >> s;
s == "americ";
Input stream content: england gana
//etc.
Вы можете попробовать std::getline
вместо этого читать целые строки. Только не смешивайте std :: cin и std :: getline.
while(true) {
std::getline(std::cin, s)
cout << "type : " << endl;
}
Программа, которую вы даете, не является правильной, ее невозможно скомпилировать из-за опечатки. inlcude, второй в вашем выводе записывается значение ‘s’, даже если это отсутствует в cout << …
В любом случае, я думаю, что понимаю вашу (ложную) проблему: cin не пропускается, вход находится в режиме блокировки, пока вы не введете конец строки, поэтому первый cin возвращается, когда все строка «сша америка англия гана \ n» читается, а не тогда, когда читается только «сша», поэтому программе не нужно ждать, чтобы вернуть «америку», ни «англию», ни «гана»