输入验证以确保只有数字c ++

时间:2013-07-31 23:25:40

标签: c++ pointers iostream

好吧,我正在尝试使用指针,所以我正在尝试为用户输入编写输入验证,以确保正确处理任何非数字的内容。当我使用isdigit()不适合我。当我输入字母表时,我仍然会遇到异常。有什么建议?谢谢。看看这个:

#include<iostream>
#include<algorithm>
#include<string>
#include<cctype>
using namespace std;

void EnterNumbers(int * , int);


int main()
{
    int input = 0;
    int *myArray;

    cout << "Please enter the number of test scores\n\n";
    cin >> input;

    //Allocate Array
    myArray = new int[input];

    EnterNumbers(myArray,input);


    delete[] myArray;
    return 0;
}

void EnterNumbers(int *arr, int input)
{

    for(int count = 0; count < input; count++)
    {
        cout << "\n\n Enter Grade Number  " << count + 1 << "\t";
        cin >> arr[count];

        if(!isdigit(arr[count]))
        {
            cout << "Not a number";
        }
    }
}

3 个答案:

答案 0 :(得分:4)

如果您测试if (!(cin >> arr[count])) ...而不是isdigit(arr[digit])测试arr[digit]的值是否为数字的ASCII码[或者可能与日语,中文或阿拉伯语匹配(即,作为阿拉伯语脚本字体,而不是像我们的“阿拉伯语”数字一样的0-9。因此,如果您输入48到57,它会说没关系,但是如果您键入6或345,它会抱怨它不是数字......

一旦发现了非数字,您还需要从“垃圾”中退出或清除输入缓冲区。 cin.ignore(1000, '\n');将读取下一个换行符或1000个字符,以先发生者为准。如果某人输入了一百万位,可能会很烦人,但除此之外,应该可以解决问题。

当然,您还需要一个循环来再次读取该数字,直到输入有效数字。

答案 1 :(得分:1)

我进行这种输入验证的方式是我使用std::getline(std::cin, str)获取整行输入,然后使用以下代码解析它:

std::istringstream iss(str);
std::string word;

// Read a single "word" out of the input line.

if (! (iss >> word))
    return false;

// Following extraction of a character should fail
// because there should only be a single "word".

char ch;
if (iss >> ch)
    return false;

// Try to interpret the "word" as a number.

// Seek back to the start of stream.

iss.clear ();
iss.seekg (0);
assert (iss);

// Extract value.

long lval;
iss >> lval;

// The extraction should be successful and
// following extraction of a characters should fail.

result = !! iss && ! (iss >> ch);

// When the extraction was a success then result is true.

return result;

答案 2 :(得分:0)

当您尝试时,

isdigit()适用于char而不是intcin >> arr[count];语句已确保输入中给出整数数字格式。分别检查cin.good()!cin)是否存在可能的输入解析错误。