【问题标题】:How does cin work?辛如何工作?
【发布时间】:2016-08-23 04:23:31
【问题描述】:

我运行了这段代码

char c;
cin >> c;
cout << c;
cin >> c;
cout << c;

然后写信到控制台ab,按下回车键。所以我在下一行得到了ab。但我无法理解它是如何工作的。在按下回车之前,程序什么都没有读,对吧?按下后,读取a,保存到char c,然后读取char c,写入a到控制台。没关系。但是它怎么能读到b 在第二行呢?第二行不是b

【问题讨论】:

  • 'c' 是一个char 类型,您执行两次cin &gt;&gt; c;,这意味着当它们可用时它将读取两个chars。因此,它读取'a',然后通过cout &lt;&lt; c; 打印它,然后读取'b' 并打印它。因此,预计会打印'a''b'(例如ab)。
  • @JamesAdkison 但是当程序写b时,它位于第二行。怎么能回到第一行呢?
  • 不太确定 cin 在内部是如何工作的,但它确实希望在您完成输入时按下新行 (Enter)。所以,它读到的可能是“a\n”,但它只显示第一个 cout 中的 a。然后,同样适用于“b\n”,但再次显示 b。 Cin 吃掉了换行符 '\n'。好读:en.cppreference.com/w/cpp/io/cinen.cppreference.com/w/cpp/io/basic_istream/ignore。第二个特别有一个示例,说明如何忽略 N 个字符或直到预期的 '\n' 字符。编辑:对于您的评论,您按下回车键使其向下移动:)
  • @Pavel 如果您仍有疑问,请提供a Minimal, Complete, and Verifiable example。此外,如果您可以准确显示您输入的内容和您看到的输出(即edit 您的问题以添加这些详细信息)。
  • @JamesAdkison 我想说这个概念从当前问题中的代码中非常清楚。为什么要强制用户添加mainusing namespace std;(或者您觉得MCVE 缺少什么)?它们与手头的问题无关。

标签: c++ iostream


【解决方案1】:

cin 是标准输入。流性质对于深入理解 C++ I/O 至关重要。

默认情况下,cin &gt;&gt; x 表示:

从当前流中的点开始,跳过可能存在的任何空格,然后尽可能长时间地继续阅读以获得x 的有效表示。

让我们暂时忽略输入来自键盘的事实。开始时流的内容是a b LINEFEED。您执行cin &gt;&gt; c,它将从输入中读取第一个字符a。这足以填写c,所以阅读停止。 cin 流现在包含 b LINEFEED。然后将变量c 写入标准输出。

接下来是另一个cin &gt;&gt; c,因此又读取了一个字符(这次是b)。同样,一个字符就足够了,所以阅读结束并且流内容只是LINEFEED。然后将b 发送到标准输出流。

标准输入和标准输出流通常与控制台相关联这一事实不会以任何方式影响它们的内部工作。 cin 不会因为屏幕上同时出现一些输出而“忘记”其中的内容。特别是,cin 读取 键盘, 而不是“控制台上的字符”。碰巧的是,按键都会在控制台上回显它们并将它们提供给cin

因此,您的程序同时输出字符a这一事实对cin流的内容没有影响。

【讨论】:

    【解决方案2】:

    cin 和 cout 是缓冲流。当你按下回车键时,'a' 和 'b' 都会进入输入缓冲区。 '>>' 运算符从该缓冲区读取(在您的情况下一次一个字符)。 '

    简而言之,cin 和 cout 都是缓冲区。输入和输出运算符使用这些缓冲区。换行符启动从实际输入到输入缓冲区以及从输出缓冲区到实际输出的数据传输。

    您可以了解更多有关 I/O 的知识。

    【讨论】:

      【解决方案3】:

      cin 是一个阻塞输入。来自键盘的任何内容都存储在缓冲区中。当您按下回车键时,系统会将缓冲区传递给应用程序代码(std::cin 代码)。运算符 >> 将决定从该缓冲区读取多少 - 一个 char、string、int、float 等。取决于操作数的类型。

      【讨论】:

        【解决方案4】:

        基本上,cin 对数据类型 char 有一个重载,只能从输入流中抓取 1 个字符,所以你的程序基本上是这样的:

        char c;
        cin >> c; // reads 'a' from the input stream (input stream contains 'ab\n')
        cout << c; // prints 'a'
        cin >> c; // changes c to 'b' (reads 'b')
        cout << c; // prints 'b'
        

        【讨论】:

          猜你喜欢
          • 2016-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多