所以我有一个学校项目要求我等待用户输入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
有关,导致某种缓冲干扰,但我对如何解决这个问题没有任何可靠的想法。如果有人能提供帮助那就太棒了。
答案 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