C++确定数字是否在特定范围内的最佳做法
C++ best practice to identify whether a digit is in a certain range
哪种方法识别数字更好?我正在分析一个 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);
这应该可以正常工作!
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- Socklen_t未在此范围内声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- 查找给定范围内最长连续 1 的频率
- "Main"已在当前范围内声明
- C++确定数字是否在特定范围内的最佳做法
- 测试值是否在阈值范围内的最佳方法(性能方面)是什么