在std :: cout之后使用std :: cin时,换行符来自哪里?

时间:2015-02-14 21:09:21

标签: c++

考虑以下简单示例

#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

此程序按预期工作,但我不明白输出流如何知道转到下一行。我基本上考虑了两个独立的信息流,并且对输出流如何知道转到下一个信息感到困惑,因为它后面跟着输入。换行符来自哪里?

3 个答案:

答案 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\noperator<<(cin, name)遵循格式化输入函数的规则,丢弃前导空格,然后将数据传输到结果,直到找到另一个空格。

现在,name包含"Bob"(此处没有新行),cin已用完新行字符以结束此输入操作。