【问题标题】:Effect of noskipws on cin>>noskipws对cin的影响>>
【发布时间】:2012-06-12 09:22:20
【问题描述】:

据我了解,提取运算符会在开头跳过空格,并在遇到空格或流结尾时停止。 noskipws 可用于停止忽略前导空格。

我有以下使用 noskipws 的程序。

#include <iostream>
using namespace std;

int main()
{
    char name[128];

    cout<<"Enter a name ";
    cin>>noskipws>>name;
    cout<<"You entered "<<name<<"\n";

    cout<<"Enter another name ";
    cin>>name;
    cout<<"You entered "<<(int)name[0]<<"\n";

    return 0;
}

我的查询是:

  1. 如果我输入“John”作为第一个输入,那么第二个 cin>> 操作不会等待输入,也不会将任何内容复制到目标,即名称数组。我希望第二个 cin>> 至少传输一个换行符或流的结尾,而不是仅仅将目标字符串设置为空。为什么会这样?

  2. 当我输入“John Smith”作为第一个 cin>> 语句的输入时,会观察到同样的情况。为什么第二个 cin>> 语句不将空格或“Smith”复制到目标变量?

以下是程序的输出:

Enter a name John
You entered John
Enter another name You entered 0


Enter a name John Smith
You entered John
Enter another name You entered 0

谢谢!!!

【问题讨论】:

  • 我希望你知道你的程序很容易产生缓冲区溢出。在生产代码中,您不应使用std::cin 写入字符数组。请改用std::string
  • 确实如此。上述代码仅用于说明目的。使用 cin.width 或 cin.getline 可以避免一些溢出问题,但正如你提到的 std::string 最好。我给出上面的示例代码只是为了展示我想要问的内容。

标签: c++ stream manipulators


【解决方案1】:

字符串&gt;&gt;的基本算法是:

skip whitespace
read and extract until next whitespace

如果您使用noskipws,则跳过第一步。第一次读取后,您将定位在空白处,因此下一次(以及所有后续)读取将立即停止,不会提取任何内容。

&gt;&gt; 到字符串永远不会在字符串中放入空格。更一般地,将&gt;&gt;noskipws 一起使用是有问题的,因为空格始终是&gt;&gt; 的分隔符;准时使用它可能是有意义的,但通常应在使用后立即重置。 (可能有意义的一次情况是使用&gt;&gt;char。在这种情况下,流总是 提取一个字符。)

【讨论】:

  • 好的,明白了。但是我仍然对为什么输入“John Smith”没有导致>>运算符在第二个输入操作中复制“Smith”感到困惑。为什么“Smith”完全从输入流中消失了,甚至第二个cin操作也没有等待输入。
  • @AchintMehta 因为要读取的下一个字符是空格,而不是"Smith" 中的S。你告诉它不要跳过空格,所以它不会。然后它输入最多但不包括下一个空格,这是立即的。 "Smith" 不会消失,只是您不阅读它。而且你不能用&gt;&gt; 读取它,除了&gt;&gt;char,因为所有其他&gt;&gt; 将在第一个空格处停止,不提取任何内容,并且不推进输入位置。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2019-05-18
  • 2016-11-06
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多