C++查看参数是否为数字

C++ See If Argument Is Numeric

本文关键字:数字 是否 参数 C++      更新时间:2023-10-16

我正在用C++创建一个加密/解密程序,我使用三个用户提供的数字来自定义加密。我在cplusplus.com上读到了关于isdigit()的文章,并在此基础上制作了一个函数:

bool is_numeric(char *string)
{
    int sizeOfString = sizeof(string);
    int iteration = 0;
    bool isNumeric = true;
    while(iteration < sizeOfString)
    {
        if(!isdigit(string[iteration]))
        {
            isNumeric = false;
            break;
        }
        iteration++;
    }
    return isNumeric;
}

然而,它似乎不起作用。无论我给它一个数字,还是一个非数字字符,它仍然返回false。我的方法出了什么问题。

我想我应该使用一个标准算法:

bool is_numeric(char const *string)
{
    return std::all_of(string, string+strlen(string), 
                       [](unsigned char c) { return ::isdigit(c); });
}

请注意,就目前情况来看,您的代码可能(通常)具有未定义的行为(如果字符串包含任何在编码为char时显示为负数的内容)。这段代码通过在char传递给lambda时将其转换为unsigned char来防止这种情况——这就是为什么我使用lambda而不是仅将::isdigit作为谓词传递给all_of

您计算的sizeOfString错误。试试这个。

bool is_numeric(char *string)
{
    int sizeOfString = strlen(string);
    int iteration = 0;
    bool isNumeric = true;
    while(iteration < sizeOfString)
    {
        if(!isdigit(string[iteration]))
        {
            isNumeric = false;
            break;
        }
        iteration++;
    }
    return isNumeric;
}

您可能还需要添加检查.字符的功能!现在,只有当字符串是整数时,代码才会返回true。

while ('0' <= *string && *string <= '9')
    ++string;
return *string == '';

或者,如果您喜欢使用isdigit:

while (is digit((int)*string))
    ++string;
return *string == '';

另一种可能的解决方案是使用字符串流:

bool isNumeric(const string& s) {
    stringstream ss(s);
    int val;
    ss >> val;
    return ! ss.fail() && ss.eof();
}

如果给定的字符串不是数字,则字符串流::operator>>(int&)将设置字符串流的失败位,并且您需要检查字符串中的所有内容是否都是一个整数(没有其他内容),因此您还测试eof位。这也适用于负数,如果您想接受浮点数,也可以将int更改为double。