如何只接受'cin'中的数字(C ++编程)?

时间:2017-02-22 18:56:17

标签: c++ cin

我有以下代码:

#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。

1 个答案:

答案 0 :(得分:1)

这是因为cin在一次传递中提取1数字,并将其存储在数组中。它在遇到a时停止读取(因为它不是整数的有效字符),并将其保留在输入缓冲区中。然后它会在下一次传递中读取a,这会导致它失败,因为它不是整数。

您应该使用std::getline来代替字符串。然后你可以做任何你想要的解析。如果它们适合您,您可以使用标准库中的函数,如std::stoi。否则编写自己的自定义解析。