我刚刚开始在学校学习编程。我一直在让我的代码拒绝来自用户的非数字cin。我找到了一种方法来做到这一点,但是现在这个奇怪的事情发生在我输入一个数字时我必须插入有效输入3次才能清除循环并继续执行程序的下一部分。
//要转换的金额
if (exchangeRate == JAPANESE_EXCHANGE_RATE)
{
cout << "How many " << currencyName << " do you need a conversion for?" << '\n' << '\n';
}
else
{
cout << "How many " << currencyName << "s do you need a conversion for?" << '\n' << '\n';
}
do
{
cin >> conversionAmount;
cout << '\n' << '\n';
if (conversionAmount > -1)
{
cout << '\n'; // nothing needs to be done, the number will be accepted and proccessed;
}
else if (!(cin >> conversionAmount) || conversionAmount < 0)
{
cin.clear();
cin.ignore(10000000000000, '\n');
cout << "That value does not work; try again";
cout << '\n' << '\n';
}
}
while (!(cin >> conversionAmount));
这只是代码的一部分搞砸了;它运行得很完美,除了我必须把它从循环中弄出来的奇怪方式。如果您需要更多的代码,我会愉快地发布它。我刚刚开始学习编程,所以如果你能解释我的错误背后的逻辑,那将对我有很大帮助。
答案 0 :(得分:1)
每次执行cin >> conversionAmount
时,输入流(cin)都在等待输入。如果你看一下代码,你的循环就会有4 cin >> conversionAmount
。所以你需要输入你的输入4次才能进入下一次迭代。
然而,总的来说,最好使用字符串流而不是直接从cin读取。看看这个Tutorial
正如您所看到的,从cin中提取似乎使得从标准输入获取输入的任务变得非常简单和直接。但这种方法也有很大的缺点。如果用户输入了无法解释为整数的其他内容,上面的示例会发生什么?那么,在这种情况下,提取操作失败。默认情况下,这可以让程序在不设置变量i的值的情况下继续运行,如果稍后使用i的值,则会生成未确定的结果。
这是非常糟糕的程序行为。无论用户类型如何,大多数程序都应以预期的方式运行,并适当地处理无效值。只有非常简单的程序才能依赖直接从cin中提取的值而无需进一步检查。稍后我们将看到如何使用字符串流来更好地控制用户输入。