C ++最佳实践,用于识别数字是否在某个范围内

时间:2013-01-27 18:19:51

标签: c++

识别数字哪种方式更好?我正在分析一个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;
    }
}

2 个答案:

答案 0 :(得分:4)

您可以使用isdigit

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

答案 1 :(得分:4)

我会将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函数,如果您提供适当的演员(请参阅this Q&A获取解释):

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

强制转换是必要的,因为在std命名空间中,存在isdigit的重载,导致重载解析出现问题。 other topic详细讨论了类似的案例。

如果这看起来很麻烦,你可以这样做:

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

这应该可以正常工作!