我正在使用while循环将整数数据存储在这样的向量中:
vector<int> a;
int data=1;
cout<<"Enter data (Press Ctrl+Z to end)";
while(data)
{
cin>>data;
if(data)
a.push_back(data);
}
这个循环变得无限,我在tacing之后发现的原因是,当我输入Ctrl+Z (eof)
来读取data
时,它不会接受该值,因为{{1}中的最后一个值仍然存在循环再次运行
data
我不想使用具有特定数字的条件来结束循环,如Enter data (Press Ctrl+Z to end)23 //data=23
56 //data=56
45 //data=45
^Z // still data=45
和用户,以指定预先存储在向量中的项目数。有没有其他方法可以使用Enter -1 to end
或任何其他字符串来结束循环,例如Ctrl+Z
答案 0 :(得分:2)
while(cin >> data){
a.push_back(data);
}
请注意,EOF通常使用Ctrl + D设置,而不是Ctrl + Z(这将使您的程序睡眠)。
答案 1 :(得分:2)
我跳过循环并用一对istream_iterator
s:
cout<<"Enter data (Press Ctrl+Z to end)";
std::vector<int> a{std::istream_iterator<int>(std::cin),
std::istream_iterator<int>()};
请注意,当它到达输入或的末尾时会停止读取它遇到无法转换为int
的内容(例如,除了数字之外的任何字符)或白色空间)。
如果你真的需要阅读所有输入(并转换你找到它们的数字),你有几个选择。我可能会使用的是创建ctype facet that classifies everything except digits as white space,因此istream将忽略除数字之外的所有内容。
另一种可能性(有些人可能会发现更直接,即使它可能更复杂)是使用std::getline
一次读取一行,然后在该字符串中搜索数字并转换为int
的数字组。如果你在一行上有多个int
,这会变得特别难看,所以你需要在刚刚转换的数字结束后重新开始搜索数字。
另请注意, control + Z 仅适用于Windows,在那里甚至不可靠。您通常希望使用 F6 。要使 control + Z 起作用,您需要使用输入 control + Z 输入
答案 2 :(得分:0)
如果(数据) a.push_back(数据);
这是有缺陷的,因为如果您输入0,则if将评估为false。