【问题标题】:Abusing cin in while loops for int assignment在while循环中滥用cin进行int赋值
【发布时间】:2011-10-15 05:16:54
【问题描述】:

只是尝试比较两个用户定义的向量,看看它们是否相等,当前代码:

vector<int> ivec1, ivec2; //vectors, uninitialized

int temp1;

cout << "Enter integers to be stored in ivec1." << endl;

while(cin >> temp1) //takes input from user and creates new element in the vector to store it
{
    ivec1.push_back(temp1);
}

int temp2;

cout << "Enter integers to be stored in ivec2." << endl;

while(cin >> temp2) //same as above with different vector
{
    ivec2.push_back(temp2);
}

if(ivec1 == ivec2)
    cout << "ivec1 and ivec2 are equal!" << endl;
else
    cout << "ivec1 and ivec2 are NOT equal!" << endl;

到目前为止,它让我可以为 ivec1 赋值,但是当我通过输入一个字母使 cin 失败退出 while 循环时,它会跳过第二个 while 块。出于好奇,我尝试在第一个 while 循环之后放入其他 cin 语句,它也将它们全部忽略。

强制 cin 失败会导致程序忽略所有其他对它的调用或其他什么,还是有其他问题?如果是这样,我怎样才能让这个程序做我想做的事?

截图供您观赏: http://img695.imageshack.us/img695/2677/cinfailure.png

*PS。拥有 temp1 和 temp2 只是我想弄清楚是否对两个分配循环使用相同的 int 是否会导致问题,无论如何我只是想我会把它留在那里

【问题讨论】:

    标签: c++ loops while-loop cin


    【解决方案1】:

    我在解决同样的问题时发现了这一点。我必须添加cin.clear() 和cin.ignore() 来重置循环之间的流并让它再次识别“cin”调用。

    【讨论】:

      【解决方案2】:

      当 first while 循环因std::cin 失败而退出时,它也会在内部设置失败标志。您只需在第一个 while 循环之后编写以下 即可清除该标志:

      scin.clear();
      

      它清除所有失败标志,以便cin 可以用于读取更多输入。

      【讨论】:

        【解决方案3】:

        在循环之间使用cin.clear()。此命令将流的状态重置为可用状态。

        知道您不必总是输入无效字符来退出循环可能会有所帮助,您还可以在控制台上使用(在 Windows 上) ctrl-z(在其他系统上为 ctrl-d),这刺激EOF。您仍然需要cin.clear()(因为 EOF 仍然会使流无效) - 但它没有那么危险

        【讨论】:

        • 感谢 ctr-z 的提示,我不知道!
        • @Martin:确实如此;但在这种情况下,无论如何从 2 个单独的文件中读取输入是合适的。
        • 依赖于两个 EOF 创建了一个无法从管道中的单个输入提供的程序......在许多方面都比哨兵更丑陋。可悲的是,他在这里最干净的哨兵可能是一个空行,并且要检测它需要使用 getline 来例如首先是一个字符串,然后从中创建一个 istringstream,然后尝试进行 int 解析,并显式检查行上的尾随垃圾。 iostreams 可能很混乱!
        【解决方案4】:

        你的意思是你在做一个 ctrl-D 来为第一个循环提供文件结尾。

        这样做的问题是,一旦达到 EOF,它将持续存在,并且第二个循环也将看到 EOF,并且永远不会读取任何内容。

        改为使用终止字符,例如空行或“。”并专门在玩具 while 循环中测试,而不是 while (cin &gt;&gt; tmp1)

        【讨论】:

          【解决方案5】:

          您必须执行cin.clear() 才能重置流状态。然后您必须确保从流中读取违规字符(使用here 描述的技术之一),以便下一个输入操作也不会失败。

          【讨论】:

            猜你喜欢
            • 2015-11-05
            • 1970-01-01
            • 2017-06-21
            • 2013-09-25
            • 2013-02-17
            • 1970-01-01
            • 2010-11-11
            • 2010-10-07
            相关资源
            最近更新 更多