“ std :: isdigit”几个扩展的ASCII字符崩溃

Pav*_*aka 3 c++ std

由于某些要求,我需要遍历字符串以查看字符串中是否存在任何数字。

当我尝试下面的代码时,在测试期间,应用程序崩溃了。经过仔细观察,我发现输入字符串具有特殊字符(扩展的ASCII字符)。

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string wordstr("tes¶¶"); //
    //int num  = unsigned char('¶'); // ASCII 182 (DEC)
    //int num1  = unsigned char('T'); // ASCII 84 (DEC)
    std::find_if(wordstr.begin(), wordstr.end(), ::isdigit) != wordstr.end();  
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么std::isdigit扩展的ASCII值崩溃?(尝试很少)。

是否有其他可选的标准函数来查找字符是否为数字,如果我的输入字符串中包含特殊字符,这不会崩溃?

注意:由于此代码库的维护问题,我不应该使用C ++ 11及更高版本。

T.C*_*.C. 5

<ctype.h>分类功能名义上接受的int,但输入的值必须可以表示为一个unsigned char或者是特殊值EOF。所有其他输入导致未定义的行为。C11§7.4p1:

在所有情况下,参数均为an int,其值应表示为an unsigned char或等于宏的值EOF。如果参数具有任何其他值,则行为是未定义的。

C ++继承了此限制。解决方案是在将任何普通char参数传递给unsigned char(not unsigned!)之前::isdigit,或在中使用C ++语言环境感知的重载<locale>