首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用std::cin之后,换行符从何而来?

在使用std::cin之后,换行符从何而来?
EN

Stack Overflow用户
提问于 2015-02-14 21:09:20
回答 3查看 1.3K关注 0票数 4

考虑下面的简单示例

代码语言:javascript
复制
#include <iostream> 

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

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

    return 0; 
}

该程序的示例输出如下:

代码语言:javascript
复制
What is your first name: Bob
Hello Bob

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-14 21:41:36

输出流不会转到下一行。

键入名称后按回车。终端具有本地回波,这意味着您在键盘上输入的字符将被回显到终端。

屏幕上看到的"Bob“和换行符是因为您输入了它们,而不是因为它们是由您的程序发送给cout的。

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

代码语言:javascript
复制
What is your first name: Hello Bob
票数 6
EN

Stack Overflow用户

发布于 2015-02-14 21:12:13

新行来自返回字符,该字符用于在使用cin命令时提交名称。之所以放置它,是因为它是用户在输入"Bob“时最初编写的。

票数 4
EN

Stack Overflow用户

发布于 2015-02-14 21:28:07

这就是写在终端机上的东西:

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

这就是它的来源(斜体从你的程序写到标准输出,粗体从终端回显):

你的名字是什么: Bob\n 你好Bob\n

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

现在,用户按回车键。这由行缓冲终端将其视为行的末尾,因此stdin现在可以看到Bob\noperator<<(cin, name)遵循格式化输入函数的规则,放弃前导空格,然后将数据传输到结果,直到找到另一个空白为止。

现在,name包含"Bob" (这里没有换行符),cin已经用掉了换行符来结束这个输入操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28520350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档