while(cin)出错

时间:2013-12-02 17:55:11

标签: c++

我刚刚写了另一个程序。用过:

while (cin) 
    words.push_back(s);

wordsvector stringsstring

我的RAM使用量在4或5个输入后上升,SWAP开始填充。我在用ubuntu?我只是没有看到这样简单的代码如何能够触发这种糟糕的后果。或者,我的系统出了什么问题?

编辑:完成计划:

#include <iostream>
#include <vector>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main ()
{
    vector<string> words;
    string s;

    cout << "Enter the string: ";
    while (cin)
        words.push_back(s);

    for (vector<string>::const_iterator iter = words.begin();
         iter != words.end(); ++iter)
        cout << *iter;

    return 0;
}

4 个答案:

答案 0 :(得分:1)

检查流的状态而不检查提取结果是一种常见的不良做法和错误。

因此,它是:

if(cin >> x) { ... }
else {
   // Error
}

用于格式化输入。

(请道歉没有回答想法的帖子)

答案 1 :(得分:1)

在您的代码中,您有while (cin),它将永远循环。这将导致您向向量中插入大量空字符串。你实际上从来没有尝试从标准输入中读取任何东西 - 你最终会得到一个无限循环来检查cin的状态(在你杀死流之前会很好),所以你最终会尝试分配一个空字符串的大量空间。

你打算写的是:

while (cin >> s)
    words.push_back(s);

std::copy(std::istream_iterator<std::string>(std::cin),
          std::istream_iterator<std::string>(),
          std::back_inserter(words));

附注:在任何一种情况下,如果您打算在程序中的某个其他位置再次使用cin,则需要清除其错误状态并刷新其缓冲区。

答案 2 :(得分:0)

测试cin或getline的成功绝对是一种很好的做法。当然,你所展示的内容存在结构性问题,因为我没有看到s充满了什么。我建议getline over cin for string inputs。这简单得多。这些类型的留言板可能有数百个关于标准输入导致奇怪行为的问题。通常,它是在对数字和字符串输入使用cin时不测试成功或不清除行尾字符的结果。我喜欢以下网站,了解有关输入/输出流的简单问题和答案。

http://www.parashift.com/c++-faq/input-output.html

您可能会看到内存问题,因为您有一个连续的循环。由于我没有看到输入流的状态将如何变化,因此您可能会数千次进入矢量。什么是s?它是一个NULL字符串,还是你发布的不完整的字符串?

答案 3 :(得分:0)

使用

while (cin>>s) 
words.push_back(s);