换行符是不是保存在标准输入中?

Posted

技术标签:

【中文标题】换行符是不是保存在标准输入中?【英文标题】:Newline character is saved in stdin or not?换行符是否保存在标准输入中? 【发布时间】:2016-07-16 09:29:31 【问题描述】:

据我所知,当我编写cin >> a 命令时,程序会等待用户输入一些字符,直到遇到换行符\n。该字符将被放入stdin。之后,cin 将把第一个字符放入a 变量中。

我编写了这个程序来将 2 个字符放入 stdin 并使用 2 个 cin 命令让它们显示:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])

    char input;
    char input_next;
    cout << "Please enter a character from your keyboard: ";
    cin >> input;
    cout << input << endl;
    cin >> input_next;
    cout << input_next << endl;
    return 0;

案例1:我输入字符串“KH”并按下回车键。它显示了 K 和 H。

Please enter a character from your keyboard: KH
K
H
Press <RETURN> to close this window...

案例2:我输入字符“K”并按下回车键。它显示 K 并等待我输入更多字符。它不显示换行符(输入按钮)。为什么?

【问题讨论】:

if (cin.eof()) 并没有按照你的想法去做。 cin.eof() 告诉您前一个输入是否已到达文件末尾,它不会尝试预测下一个输入的结果。 我建议你删除以if (cin.eof())开头的四行。它们与您的实际问题无关,并且会使其他人误解您的问题。 @Revolver_Ocelot:谢谢,我只是用它来检查标准输入。它与我的问题无关。我会删除它。 【参考方案1】:

“>>”运算符在读取字符或字符串时会跳过所有空格。所以,当你只输入一个字母时,程序只会等待,直到你给它一些东西来读。

如果你想让它读入换行符、eof's、空格,你可以使用 cin.get() 函数,无论它是什么,它都会获取缓冲区中的下一个字符。

【讨论】:

关键术语是“格式化输入”和“未格式化输入”,仅供参考。【参考方案2】:

据我所知,当我编写 cin >> 命令时,程序会等待用户输入一些字符,直到遇到换行符 \n。该字符将被放入标准输入。

它稍微复杂一些。 C++ 程序只与标准输入流交互。字符如何以它结尾,以及用户如何将它们提供给程序取决于操作系统(或者可能是运行时库)。大多数操作系统都会进行具有您描述的行为的行缓冲,但从程序的角度来看,它是连续的字符流。

之后,cin 会取第一个字符放入一个变量中。

这取决于a 的类型,但我想你的意思是它具有char 类型。在这种情况下,它执行格式化输入:它丢弃所有空白字符(空格、制表符、换行符、垂直制表符...),直到遇到非空格或到达流的末尾。您没有看到打印换行符,因为 operator>> 跳过它 并等待非空格字符出现在流中。

【讨论】:

这意味着它会忽略空白字符,不认为空白是像 A,B,C,1,2,3 这样的字符...对吗? @khanhoct 是的。我建议检查reference。要读取空白字符,您可以使用unformatted input

以上是关于换行符是不是保存在标准输入中?的主要内容,如果未能解决你的问题,请参考以下文章

将 "\n" 添加到 Java String 时,换行符不会出现在 JSP 中,但会出现在标准输入中

如何从标准输入读取一行,阻塞直到找到换行符?

go:读取标准输入

go:读取标准输入

如何从标准输入读入数据--java语言

Python 使用 input() 逐行遍历标准输入