为什么 std::cin 从一开始就不读
why is std::cin not reading from the start
我正在研究一个涉及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贝克尔的更正。
相关文章:
- 自一周开始以来的秒数?
- 使 std::fstream 写入文件末尾,但从头开始读取
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 哪个C++规范开始支持 std::vector
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 为什么 std::cin 从一开始就不读
- 代码只输出一次 std::vector,而不是多次输出
- 如何创建一组std::结构
- 从最后一开始就剩下的argv
- 更换一堆std ::矢量条目
- 要创建一个一开始没有特定维度的类Vector,请在类中创建一个方法,允许向向量添加维度
- GDB -如何从一开始就进入步进模式
- 基于列的一维std::矢量矩阵排序
- 在线评委:创建了一堆std::堆栈
- 为什么我们需要把const放在函数头的末尾,而一开始是静态的
- 为什么代码一开始打印0
- 制作《马里奥派对》游戏,但游戏一开始就会宣布谁是赢家