2017-04-10 100 views
2

由于一些要求,我需要通过一个字符串来走走看看,如果字符串中存在任意数量。“的std :: ISDIGIT”崩溃的几个扩展ASCII字符数

当我尝试下面的代码,我的测试过程中,应用程序崩溃。经过仔细的观察,我注意到,输入字符串包含特殊字符(扩展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; 
} 

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

是否有任何替代标准功能找到如果字符是数字,它惯于崩溃,如果我有我的输入字符串特殊字符?

注:我不应该使用C++ 11以上,由于该代码库的维护问题。

+1

梅萨没有复制! Yousa告诉我们编译器和版本? – user4581301

+0

Visual Studio 2010 C++编译器 – Naidu

+2

有没有想过为什么C程序员将'char'参数转换为'isXXX'为'unsigned'类型? 'isXXX'需要一个'int'参数,一个带符号位的符号字符会被提升为负的'int'.Sounds就像你的'isXXX'函数那样使用一个简单的表格查找,它在负索引下表现不佳。 – WhozCraig

回答

4

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

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

C++继承此限制。该解决方案是将它传递给::isdigit之前投任何纯char参数unsigned char(未unsigned!),或在<locale>使用C++语言环境感知过载。

+0

但是在OP的代码中不会find_if检查字符而不是整数? –

+0

是的.........现在我不得不根据上面的建议去使用函子了.. – Naidu

+0

在写下functor之后工作...花了一段时间来构建。结构FindNumber { \t布尔运算符()(炭SCHAR)const的 \t { \t \t INT NUM =无符号字符(SCHAR); \t \t return :: isdigit(num); \t} }; – Naidu