识别数字哪种方式更好?我正在分析一个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;
}
}
答案 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);
这应该可以正常工作!