C++ 在std::cout之后使用std::cin时,newline从何而来?

C++ 在std::cout之后使用std::cin时,newline从何而来?,c++,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; }

考虑下面的简单示例

#include <iostream> 

int main() 
{
    using namespace std;
    char name[30];        

    cout << "What is your first name: ";
    cin >> name;
    cout << "Hello " << name << endl;

    return 0; 
}

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

新行来自使用cin命令时用于提交名称的返回字符。之所以简单地放置它,是因为它是用户在键入“Bob”时最初写入的内容。

这是写入终端的内容:

您的名字是什么:Bob\n Hello Bob\n

这就是它的来源(斜体字来自程序写入标准输出,粗体字来自终端回波):

你的名字是什么:鲍勃\n你好,鲍勃\n

当用户键入(shift)+B、O、B时,终端缓冲区保持
Bob
。由于终端是行缓冲的,
stdin
还没有收到任何数据


现在用户按Enter键。线路缓冲终端将其视为线路的终点,因此
stdin
现在将看到
Bob\n
<代码>运算符输出流不会转到下一行

键入名称后按Enter键。终端已启用本地回显,这意味着您在键盘上输入的字符将回显到终端

您在屏幕上看到的“Bob”和换行符之所以出现,是因为您键入了它们,而不是因为程序将它们发送到了
cout

如果使用关闭了本地回显的终端,或者从包含
Bob
的文件中通过管道输入,则输出如下所示:

What is your first name: Hello Bob

这是正确的。如果要删除它,请将“Bob\n”替换为“Bob0”,其中0是空字符。这是否意味着在字符数组“name”中有一个返回字符,该返回字符来自enter键,后跟表示字符串结尾的空字符“\0”?我理解正确吗?@Ockham:不,它没有在变量中结束。但输入是行缓冲的。用户按下ENTER键,终端会回显。因此,当您按下ENTER键时,返回字符会自动回显到终端,然后被丢弃?cin用于确定何时放置字符串的终止字符的功能由返回键触发。它将识别返回字符,并用字符串中的空终止符替换它,但是显示器不会被告知执行任何其他操作。它所做的是,当你在cin行中键入名称时,它将打印用户键入的任何内容,你没有告诉它做任何不同的操作,这包括新行字符,这就是为什么它没有把新行带到变量中,并在你可以的时候重新打印它的原因。正如Ryan Holden在他的回答中所说的那样,这并不是真正可以预防的。要在输入std::cin的同一行上打印文本,请使用
system(“cls”)清除窗口并再次打印所有以前的内容(假设您可以重建它)。好的,现在一提到系统(“cls”),我就吐。禁用终端echo(这是一个特定于平台的操作)是可以预防的。此外,当用户看不到自己的输入时,可能会混淆用户。要回显除换行符以外的所有字符,除了将其存储在缓冲区中之外,还需要禁用行缓冲、进程控制字符(如退格)和回显“正常”字符。好的,如果我理解正确,那么std::cin使用“\n”字符标记输入操作的结束,然后该'\n'字符自动回显到终端?我只是想确定我明白到底发生了什么。谢谢你的邀请help@Ockham:否。您的终端会回显每个键。由于行缓冲,当用户键入B-O-B时,您的程序(和
cin
)根本不会接收任何内容,但它们会出现在屏幕上。那是工作中的终端回声。因此,顺序是:(shift)+B被按下,并被回显,并存储在终端缓冲区中。O被按下、回声和缓冲。B被按下、回声和缓冲。按下Enter键并回显,导致包含
Bob\n
的缓冲区传送到程序。然后,
cin
读取第一个空白,即
\n
。Echo发生在
cin
获取ITAH之前!我终于明白了。谢谢你的回复。我第一次读到这个答案时就明白了,这是一个加号。干杯
What is your first name: Hello Bob