isdigit()函数传递一个中文参数

时间:2017-04-21 14:00:06

标签: c++

当我尝试使用带有中文字符的isdigit()函数时,它会在Visual Studio 2013中以调试模式报告一个断言,但在发布模式下没有问题。

我认为如果这个函数是确定参数是否为数字,如果中文错误,为什么不返回0?

这是我的代码:

string testString = "abcdefg12345中文";
int count = 0;
for (const auto &c : testString) {
    if (isdigit(c)) {
        ++count;
    }
}

这是断言:

Image

2 个答案:

答案 0 :(得分:5)

你违反了isdigit(int)的合同,该合同只要求所述范围内的ASCII字符。

  

如果ch的值不能表示为unsigned char且不等于EOF,则行为未定义。

你的标准库实现是善良和断言,而不是继续吹嘘。

您可以在此处使用另一种可识别区域设置的isdigit(charT ch, const locale&)

我建议进一步研究如何"字符"在计算机上工作,尤其是编码更多" 1 字符集。

1 从计算机历史的角度来看。当然,对你来说,这是 less 充满异国情调的选择!

答案 1 :(得分:0)

isdigit()中的<ctypes.h>及相关函数/宏期望从intunsigned 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;
    }
}
相关问题