用while(cin&gt;&gt; x)</int>填充std :: vector <int>的问题

时间:2013-09-07 08:28:38

标签: c++ parsing io while-loop cin

所以我有一个学校项目要求我等待用户输入Ctrl + Z来结束循环。老师说最好的方法是检查cin >> x,如果这是真的,那么他们还没有输入Ctrl + Z.经过一些测试后来回走,我无法弄清问题是什么,所以我制作了一个超级简单的代码版本,看看我是否可以修复它。什么都没有改变。无论如何这里是简单的代码:

#include "Proj_02.h";

vector<int> dog;
string entry = "";
int value = 0;

void main()
{
    Menu();
}

void Menu()
{
    do
    {
        //Ask the user to enter a number
        cout << "Enter a number: ";
        //Save the number to a vector
        do
        {
            cout << "k";
            getline(cin, entry);
            value = atoi(entry.c_str());
        }while(value == 0);

        while (cin >> value)
        {
            cout << "L";
            dog.push_back(value);
        }

    //when the user presses Ctrl + Z stop asking
    }while(cin >> entry);

    //Display all of the numbers
    for(int i = 0;i < dog.size();i++)
    {
        cout << dog.at(i) << endl;
    }

    system("PAUSE");
}

所以当运行它时会发生什么,代码等待我输入2个以上的值,甚至在完成任何输入之后做任何事情。我的猜测是它与while cin >> entry有关,导致某种缓冲干扰,但我对如何解决这个问题没有任何可靠的想法。如果有人能提供帮助那就太棒了。

5 个答案:

答案 0 :(得分:1)

使用流时,请在使用结果前测试状态。

因此:

while(std::cin >> value) {
    ...
}

if(std::getline(cin, entry)) {
    ...
}

答案 1 :(得分:1)

如果您从终端获取输入,则除了Ctrl+Z之外没有其他选项,因为这表示文件结束到终端。但是如果您使用文件来提供来自终端的输入,那么使用scanf("%d",&entry)!=EOF这将自动检测文件结束并终止程序。 PS:如果您打算使用scanf,那么首先要包含cstdio库。

答案 2 :(得分:1)

“我无法弄清问题是什么,所以我制作了一个超级简单的代码版本” - 这是非常合理的决定和正确的事情,不过你做的代码根本不简单:

do {
    cout << "Enter a number: ";
    do {
        cout << "k";
        getline(cin, entry);
        value = atoi(entry.c_str());
    } while(value == 0);

    while (cin >> value) {
        cout << "L";
        dog.push_back(value);
    }
} while(cin >> entry);

如果你想测试while (cin >> value)在运行时的工作方式,你应该从这开始:

while (cin >> value) {
    dog.push_back(value);
}

如果您想要更复杂的解析,因此在实际检索数字之前将每行读入std::string对象是有意义的,它可能如下所示:

std::string line;
while (std::getline(std::cin, line)) {
    if (line.empty())
        ...
    ...
}

答案 3 :(得分:0)

cin >> value不只是对EOF的测试,它从输入缓冲区读取数据。因此,您不应该在阅读后放弃这些值。

现在您的代码输入一行(通过getline),丢弃其数据并输入一个数字(通过cin >> value),然后它想要另一行并丢弃它(cin >> entry )。这就是为什么你必须输入多个数字而它只处理其中一个数字的原因。

答案 4 :(得分:0)

考虑以下简单示例。你可以在linux上使用ctrl-d或在windows上使用ctrl-z来结束cin并让代码继续或者在这种情况下只需点击q。

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

int main()
{
  std::vector<int> v;
  std::string buffer;
  while ((std::cin >> buffer) && (buffer != "q"))
    v.emplace_back(atoi(buffer.c_str()));

  for ( auto& i : v )
  {
    std::cout << i << " ";
  }
  std::cout << std::endl;
}
output:

12
13
177
205
q
12 13 177 205