如何在循环运行时停止以在向量中存储数据

时间:2013-11-07 16:53:18

标签: c++ loops vector stl

我正在使用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

3 个答案:

答案 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。