0

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

2 回答 2

4

你可以只使用isdigit.

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

于 2013-01-27T18:21:22.897 回答
4

我会std::all_of结合使用以下谓词(如果是简短的 lambda 则更好)std::isdigit()

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

这允许您测试您希望的任何子范围,并且迭代周期是免费的。

您必须包括<cctype>标题 (for std::isdigit()) 和<algorithm>标题 (for std::all_of)。

编辑:

如果您不想使用 lambda,您甚至可以std::digit直接传入该函数,前提是您提供了正确的强制转换(请参阅此 Q&A以获得解释):

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);

那应该可以正常工作!

于 2013-01-27T18:23:55.317 回答