为什么 std::cin 从一开始就不读

why is std::cin not reading from the start

本文关键字:一开始 std cin 为什么      更新时间:2023-10-16

我正在研究一个涉及std::cin如何工作的问题。这就是问题所在:

如果以下程序要求您输入,您键入两个名称(例如塞缪尔贝克特(会做什么?

#include <iostream>
#include <string>
int main() {
std::cout << "What is your name? ";
std::string name;
std::cin >> name;
std::cout << "Hello, " << name << std::endl << "And what is yours? ";
std::cin >> name;
std::cout << "Hello, " << name << std::endl << "; nice to meet you too!" << std::endl;
return 0;
}

我预计输出是:

What is your name? Samuel Beckett
Hello, Samuel
And what is yours? Hello, Samuel
; nice to meet you too!

但输出是:

What is your name? Samuel Beckett
Hello, Samuel
And what is yours? Hello, Beckett
; nice to meet you too!

任何人都可以帮忙,std::cin工作情况如何?

我知道如果我这样做:

std::string a, b;
std::cin >> a >> b;

并输入两个单词,然后a将具有第一个单词,b将具有第二个单词。但为什么会这样呢?std::cin不应该首先丢弃所有空格,然后读取字符,直到到达另一个空格吗???

任何帮助都深表感谢。

如果以下程序要求您输入两个名称(例如塞缪尔贝克特(,它会做什么?

operator>>遇到空格(以及其他条件(时停止读取。因此,对>>的第一次调用只返回Samuel,将Beckett留在输入缓冲区中,以便下一次调用>>返回。这正是你看到的情况。

我知道如果我这样做:

std::string a, b;
std::cin >> a >> b;

并输入两个单词,然后 A 将具有第一个单词,B 将具有第二个单词。

两者之间没有任何区别

std::cin >> a >> b;

std::cin >> a;
std::cin >> b;

在第一种情况下,operator>>返回对正在从中读取的流的std::istream&引用,这允许将多个操作链接在一起。但是,相同的操作也可以在单独的语句中完成。

std::cin 不是应该首先丢弃所有空格,然后读取字符直到到达另一个空格吗???

不是std::cin本身,而是operator>>,但是是的,这正是这里正在发生的事情。

流提取器 (>>( 是空格分隔的 - 当它读取时,当它遇到任何空格时它会停止。下次使用它时,它会从中断的地方开始读取。如果只想在换行符上分隔,可以改用cin.getline()

编辑:来自@Pete贝克尔的更正。