我有以下代码:
#include <iostream>
#include <limits>
#include <locale>
using namespace std;
int main(int argc, char** argv) {
setlocale(LC_ALL, "English");
int i, vetor[16];
for(i = 0; i < 16; i ++) {
cout << "Input the position: [" << i << "]: ";
cin >> vetor[i];
if(cin.fail()) {
cin.clear();
cin.ignore(numeric_limits < streamsize > ::max(), '\n');
cout << "Please, input only numbers." << endl;
i --;
continue;
}
if(vetor[i] <= 0) {
cout << "Insert a non-zero value." << endl;
i --;
continue;
}
}
cout << vetor[0];
return 0;
}
我只需要接受数字。当我运行它并插入"1"
(或任何其他数字)时,它会转到以下位置,这是正确的。当我输入"a"
时,它会向我显示错误并警告我只输入数字,这也是正确的。如果我输入"a1"
,则会发生同样的事情,这是正确的。但是当我输入"1a"
时,它会向我显示警告,但是代码会继续到下一个位置,当它使用cout
上方的return
命令执行最后一行时,它会告诉我我的值是"1"
,而不是"1a"
,因为我相信变量的类型是int
。
有人能告诉我为什么会这样吗?我只需要接受数字,"1a"
不是数字。如何过滤此内容以及如何在输入"1a"
时执行此操作,与输入"a"
的内容相同?
我使用DevC ++ 5.11。
答案 0 :(得分:1)
这是因为cin
在一次传递中提取1
数字,并将其存储在数组中。它在遇到a
时停止读取(因为它不是整数的有效字符),并将其保留在输入缓冲区中。然后它会在下一次传递中读取a
,这会导致它失败,因为它不是整数。
您应该使用std::getline
来代替字符串。然后你可以做任何你想要的解析。如果它们适合您,您可以使用标准库中的函数,如std::stoi
。否则编写自己的自定义解析。