Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::cin从一开始就没有读取_C++_Cin - Fatal编程技术网

C++ 为什么std::cin从一开始就没有读取

C++ 为什么std::cin从一开始就没有读取,c++,cin,C++,Cin,我在看一个关于std::cin如何工作的问题。这就是问题所在: 如果以下程序要求您输入时,您键入两个名称(例如Samuel Beckett),该怎么办 但结果是: 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; s

我在看一个关于
std::cin
如何工作的问题。这就是问题所在:

如果以下程序要求您输入时,您键入两个名称(例如Samuel Beckett),该怎么办

但结果是:

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;
std::string a, b;
std::cin >> a >> b;
然后输入两个单词,
a
将有第一个单词,
b
将有第二个单词。但是为什么会发生这种情况呢?
std::cin
不应该首先丢弃所有空格,然后读取字符直到达到另一个空格吗

非常感谢您的帮助。

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

编辑:来自@Pete Becker的更正。

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

编辑:来自@Pete Becker的更正

如果以下程序要求您输入时,您键入两个名称(例如Samuel Beckett),该怎么办

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

我知道如果我这样做:

    std::string a, b;
    std::cin >> a >> b;
std::string a, b;
std::cin >> a >> b;
然后输入两个单词,a将有第一个单词,b将有第二个单词

两者之间没有任何区别

std::cin >> a >> b;

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

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

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

如果以下程序要求您输入时,您键入两个名称(例如Samuel Beckett),该怎么办

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

我知道如果我这样做:

    std::string a, b;
    std::cin >> a >> b;
std::string a, b;
std::cin >> a >> b;
然后输入两个单词,a将有第一个单词,b将有第二个单词

两者之间没有任何区别

std::cin >> a >> b;

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

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


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

我的问题是为什么
cin
为不同的变量存储不同的值,这意味着读取下一个变量时,它是从空白之后开始的。它不应该再次从文件的开头开始吗???@CeNiEi当您第一次读入cin时,您给它
Samuel Beckett
。它读取
Samuel
,然后停止。但是,
Beckett
仍然存在,所以下次调用它时,它会继续读取。我的问题是为什么
cin
会为不同的变量存储不同的值,这意味着读取下一个变量时,它是从空格后开始的。它不应该再次从文件的开头开始吗???@CeNiEi当您第一次读入cin时,您给它
Samuel Beckett
。它读取
Samuel
,然后停止。但是,
Beckett
仍然存在,所以下次调用它时,它会继续读取。另一方面,
cin
是将字符读入缓冲区,并形成缓冲区提取操作符,直到读取空白的那一个吗???@CeNiEi不完全正确。实际上是分配给
std::cin
std::streambuf
进行实际读取和缓冲。默认情况下,
std::cin
由从进程的
stdin
读取的
std::streambuf
初始化。但是,如果需要,您可以随时交换另一个
std::streambuf
来读取其他内容<代码>操作员>>读取
std::istream
,然后读取
std::streambuf
,后者根据需要读取和缓冲。非常感谢!这是一个非常有用的旁注,
cin
将字符读入缓冲区,并形成缓冲区提取操作符读取到空白???@CeNiEi不完全正确。实际上是分配给
std::cin
std::streambuf
进行实际读取和缓冲。默认情况下,
std::cin
由从进程的
stdin
读取的
std::streambuf
初始化。但是,如果需要,您可以随时交换另一个
std::streambuf
来读取其他内容<代码>操作员>>读取
std::istream
,然后读取
std::streambuf
,后者读取