2017-04-10 97 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