【问题标题】: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:谢谢,我只是用它来检查标准输入。它与我的问题无关。我会删除它。

标签: c++ c++11


【解决方案1】:

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

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

【讨论】:

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

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

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

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

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

【讨论】:

  • 这意味着它会忽略空白字符,不认为空白是像 A,B,C,1,2,3 这样的字符...对吗?
  • @khanhoct 是的。我建议检查reference。要读取空白字符,您可以使用unformatted input
猜你喜欢
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多