考虑以下简单示例
#include <iostream>
int main()
{
using namespace std;
char name[30];
cout << "What is your first name: ";
cin >> name;
cout << "Hello " << name << endl;
return 0;
}
该程序的示例输出如下:
What is your first name: Bob
Hello Bob
此程序按预期工作,但我不明白输出流如何知道转到下一行。我基本上考虑了两个独立的信息流,并且对输出流如何知道转到下一个信息感到困惑,因为它后面跟着输入。换行符来自哪里?
答案 0 :(得分:6)
输出流不会转到下一行。
键入名称后按Enter键。终端具有本地回显,这意味着您在键盘上输入的字符将回显到终端。
您在屏幕上看到的“Bob”和换行符是因为您输入了它们,而不是因为它们已被您的程序发送到cout
。
如果您使用了关闭本地回声的终端,或者您从包含Bob
的文件中输入了输入,那么输出将如下所示:
What is your first name: Hello Bob
答案 1 :(得分:4)
新行来自用于在使用cin命令时提交名称的返回字符。它被简单地放置,因为它是用户在键入&#34; Bob&#34;时最初编写的内容。
答案 2 :(得分:1)
这是写到终端的内容:
你的名字是什么:Bob \ nHello Bob \ n
这就是它的来源(从你的程序写到stdout的斜体,从终端回显粗体):
您的名字是什么: Bob \ n Hello Bob \ n
当用户键入(shift)+ B,O,B时,终端缓冲区保持Bob
。由于终端是线路缓冲的,stdin
尚未收到任何数据。
现在用户按下Enter键。行缓冲终端将其视为行尾,因此stdin
现在看到Bob\n
。 operator<<(cin, name)
遵循格式化输入函数的规则,丢弃前导空格,然后将数据传输到结果,直到找到另一个空格。
现在,name
包含"Bob"
(此处没有新行),cin
已用完新行字符以结束此输入操作。