0

所以我有一个学校项目,需要我等待用户输入 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 个值,然后再执行任何输入后的任何操作。我的猜测是它与cin >> entry导致某种缓冲区干扰的同时有关,但我对如何解决这个问题并没有任何可靠的想法。如果有人可以提供帮助,那就太棒了。

4

5 回答 5

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())
        ...
    ...
}
于 2013-09-07T08:51:47.303 回答
1

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

因此:

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

if(std::getline(cin, entry)) {
    ...
}
于 2013-09-07T08:46:10.307 回答
1

如果您从终端获取输入,那么您别无选择,Ctrl+Z因为这会向终端发出文件结束信号。但是,如果您使用文件从终端提供输入,那么使用scanf("%d",&entry)!=EOF它会自动检测文件结尾并终止程序。PS:如果你要使用,scanf那么首先包含 cstdio 库。

于 2013-09-07T08:46:43.440 回答
0

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

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

于 2013-09-07T08:40:01.313 回答
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
于 2013-09-07T08:59:14.180 回答