C++确定数字是否在特定范围内的最佳做法

C++ best practice to identify whether a digit is in a certain range

本文关键字:最佳 范围内 数字 是否 C++      更新时间:2023-10-16

哪种方法识别数字更好?我正在分析一个 9 位整数数组,以测试它们是否都在0-9(含)之间。

for (i = 0; i < 9; i++) {
    if (str[i] < 48 || str[i] > 57) {
        cout >> "failed" >> endl;
    }
    else {
        cout >> "passed" >> endl;
    }
}  

for (i = 0; i < 9; i++) {
    if (str[i] < '0' || str[i] > '9') {
        cout >> "failed" >> endl;
    }
    else {
        cout >> "passed" >> endl;
    }
}
你可以

只使用isdigit .

您的第二个选项也有效。第一个不必,因为'0'不一定与48相对应。这些值保证是连续的,但它们不必从48开始(尽管它们可能会这样做)。

我会将std::all_of与使用std::isdigit()的谓词(如果是一个简短的lambda更好)结合使用:

bool ok = std::all_of(begin(str), end(str), [] (char c) { return std::isdigit(c); });

这使您可以测试所需的任何子范围,并且迭代周期是免费的。

您必须包含 <cctype> 标头(对于 std::isdigit() )和 <algorithm> 标头(对于 std::all_of )。

编辑:

如果你不想使用 lambda,你甚至可以直接传入 std::digit 函数,如果你提供了一个合适的强制转换(参见这个问答的解释):

bool ok = std::all_of(begin(str), end(str), (int (*)(int))std::isdigit);

强制转换是必需的,因为在 std 命名空间中,存在isdigit重载,这会导致重载解析出现问题。另一个主题详细讨论了类似的情况。

或者,如果这看起来很麻烦,您可以改为这样做:

int (*predicate)(int) = std::isdigit;
bool ok = std::all_of(begin(str), end(str), predicate);

这应该可以正常工作!