0

我正在使用 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它不采用那个值并且因为最后一个值仍然存在于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或任何其他字符串来结束循环done, finish etc..

4

3 回答 3

2
while(cin >> data){
    a.push_back(data);
}

请注意,EOF 通常是使用 Ctrl+D 设置的,而不是 Ctrl+Z(这会让您的程序休眠)。

于 2013-11-07T16:56:04.727 回答
2

我会跳过循环并用一对istream_iterators 读取数据:

cout<<"Enter data (Press Ctrl+Z to end)";

std::vector<int> a{std::istream_iterator<int>(std::cin),
                   std::istream_iterator<int>()};

请注意,当它到达输入的末尾遇到无法转换为 an 的内容int(例如,除数字或空格之外的任何字符)时,它将停止读取。

如果您确实需要读取所有输入(并在找到它们的地方转换数字),您有几个选择。我可能会使用的一个方法是创建一个ctype facet,它将除数字之外的所有内容分类为空格,因此 istream 将忽略除数字之外的所有内容。

另一种可能性(有些人可能会发现更简单,即使它可能会更复杂)是一次读取一行std::getline,然后在该字符串中搜索一个数字并将该组数字转换为int. 如果一行中可能有多个数字,这会变得特别难看int,因此您需要在刚刚转换的数字结束后重新开始搜索数字。

另请注意,control+Z仅适用于 Windows,并且在那里甚至不是特别可靠。您通常想F6改用。要使control+Z起作用,您需要使用enter control+ Z enter

于 2013-11-07T16:59:58.653 回答
0

如果(数据)a.push_back(数据);

这是有缺陷的,因为如果您输入 0,则 if 将评估为假。

于 2013-11-07T17:00:48.913 回答