isdigit只能判断单个字符是否为'0'–'9',不能直接用于字符串;正确用法是遍历std::string每个字符并配合static_cast调用,且须先判空。
isdi
git
只能判断单个字符,不能直接用于字符串
是 C 标准库函数(
或
),它接收一个
(实际是
范围内的值),返回非零表示该字符是 ASCII 数字('0'–'9')。它**不接受
或 C 风格字符串指针**,直接传入会导致编译错误或未定义行为。
常见误用:
——
是
,编译失败
—— 传入指针,行为未定义(可能崩溃或返回假阳性)
—— 只检查首字符,忽略其余
判断整个 std::string 是否为纯数字的可靠写法
需遍历每个字符,并确保字符串非空。注意:不处理符号(如 "-")、小数点、空格或科学计数法——这些都属于“非纯整数数字”范畴。
示例(C++11 及以上):
立即学习
“
C++免费学习笔记(深入)
”;
关键点:
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
必须用
传给
,否则若
为负值(如某些平台的扩展 ASCII),会触发未定义行为
空字符串应明确返回
,因为 "" 不是数字
不跳过首尾空格;如需容忍空格,得先
等手动 trim
想支持负号或小数?别硬改 isdigit,换更合适的方案
的设计目标就是“单字符是否为 0–9”,强行拼凑逻辑支持 '-' 或 '.' 容易出错,且边界情况多(如 "--123"、"12.34.56"、".5"、"1e3")。
推荐做法:
判断带符号整数:用
+ 异常捕获,或手动检查首字符再调用
(仅限后续子串)
判断浮点数:用
,或正则表达式
(注意精度和合法性差异)
需要严格控制格式(如仅允许非负整数且无前导零):单独写解析逻辑,比堆砌
更清晰可靠
性能与兼容性提醒
是 locale 敏感的——默认 "C" locale 下只认 '0'–'9',但若当前 locale 改变(如调用
),可能返回意外结果。生产环境建议显式使用
或坚持
+ C locale 行为。
另外,对长字符串频繁判断时,
写法更简洁但无性能优势:
真正容易被忽略的是:
对
返回
,所以用在 C 字符串上必须确保不越界;而
的
在
时访问
是未定义行为——别忘了先判空。
isdigitintunsigned charstd::stringisdigit(s)sstd::stringisdigit(s.c_str())isdigit(s[0])bool is_all_digits(const std::string& s) {
if (s.empty()) return false;
for (char c : s) {
if (!std::isdigit(static_cast(c))) {
return false;
}
}
return true;
} static_cast(c) std::isdigitcharfalsestd::string::find_first_not_of(" \t\n\r")isdigitstd::stoiis_all_digitsstd::stodstd::regex_match(s, std::regex(R"(^-?\d+\.?\d*$)")isdigitstd::isdigitstd::setlocalestd::isdigit(c, std::locale::classic())static_caststd::all_ofstd::all_of(s.begin(), s.end(), [](char c) {
return std::isdigit(static_cast(c));
}) && !s.empty(); isdigit'\0'falsestd::stringoperator[]size()==0[0]