当我尝试使用带有中文字符的isdigit()
函数时,它会在Visual Studio 2013中以调试模式报告一个断言,但在发布模式下没有问题。
我认为如果这个函数是确定参数是否为数字,如果中文错误,为什么不返回0?
这是我的代码:
string testString = "abcdefg12345中文";
int count = 0;
for (const auto &c : testString) {
if (isdigit(c)) {
++count;
}
}
这是断言:
答案 0 :(得分:5)
你违反了isdigit(int)
的合同,该合同只要求所述范围内的ASCII字符。
如果ch的值不能表示为unsigned char且不等于EOF,则行为未定义。
你的标准库实现是善良和断言,而不是继续吹嘘。
您可以在此处使用另一种可识别区域设置的isdigit(charT ch, const locale&)
。
我建议进一步研究如何"字符"在计算机上工作,尤其是编码更多" 1 字符集。
1 从计算机历史的角度来看。当然,对你来说,这是 less 充满异国情调的选择!
答案 1 :(得分:0)
isdigit()
中的<ctypes.h>
及相关函数/宏期望从int
或unsigned char
转换EOF
,这在大多数系统上都意味着值在0-255范围内(或EOF
为-1)。因此,任何不在-1 ... 255范围内的值都是不正确的。
问题1:您正在传递char
,系统上的范围为-128 ... + 127。解决这个问题很简单:
if (isdigit(static_cast<unsigned char>(c)))
这不会崩溃,但对于汉字来说不太正确。
问题2:非ASCII字符应该使用iswdigit()
代替。这将正确处理中文字符:
wstring testString = L"abcdefg12345中文";
int count = 0;
for (const auto &c : testString) {
if (iswdigit(c)) {
++count;
}
}