我刚刚写了另一个程序。用过:
while (cin)
words.push_back(s);
words
是vector
string
,s
是string
。
我的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;
}
答案 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);