2014-12-20 45 views
3

我必須寫符號的計數器。如果我在字符串中尋找scount是3,但是如果我正在尋找西里爾文(н),那麼錯了。我試圖尋找237的代碼。此代碼我在ASCII表http://ascii.org.ru/ascii.pdf中找到。西里爾文的問題,字符串搜索

我該如何解決它?

#include <stdio.h> 
#include <string.h> 

int main() { 
    char str[] = "This is a string. нннн"; 
    char * pch; 
    int count = 0; 

    pch = strchr(str, 's'); 

    while (pch != NULL) { 
    count++; 
    pch = strchr(pch + 1, 's'); 
    } 
    printf("%i", count); 
    return 0; 
} 
+1

'н'是Unicode character.Maybe [這](http://www.cprogramming.com/tutorial/unicode.html)會幫助你。 –

+0

我不太清楚'strchr()是否可以用'wchar_t'工作。也許你可以將數組作爲'wchat _t'並嘗試自己比較ASCII值? –

+1

@justmscs但是gcc給我顯示錯誤信息:'字符太大,不能包含字符文字類型pch = strchr(str,'н');' – rel1x

回答

3

我建議切換到wchar_t和寬字符功能(​​等)。

因此,程序中的字符數據將存儲在32位(Linux)或16位(Windows)而不是8位。這將允許正確處理所有語言環境。

此外,如果您需要使用UTF-8(多字節字符串),則mbstowcs()應將數據轉換爲wchar_t

完整的示例:

#include <stdio.h> 
#include <wchar.h> 

int main() { 
    wchar_t str[] = L"This is a string. нннн"; 
    wchar_t * pch; 
    int count = 0; 

    pch = wcschr(str, L'н'); 

    while (pch != NULL) { 
    count++; 
    pch = wcschr(pch + 1, L'н'); 
    } 
    wprintf(L"%i", count); 
    return 0; 
} 
+0

爲什麼'wprintf'而不是'printf ''在打印'int'時看起來是多餘的, – GingerPlusPlus

+2

@GingerPlusPlus,true,您可以使用'printf()',但是根據我的經驗,您不能可靠地混合ASCII ant WC I/O函數(因爲在Linux描述符在首次使用時切換爲ASCII或WC),這種情況下,WC I/O很可能會被使用,所以以防萬一...... – kestasx

4

您必須用西里爾文編碼保存C文件。

如果使用Unicode保存文件,例如UTF-8 н將是一個兩字節的字形。

0x04 0x3d (4 61) 

0xed   (237) 

實際上,你的編譯器在讀什麼,當它分析你的源文件,並遇到行:

pch = strchr(str, 'н'); 

pch = strchr(str, 0x0461); 

pch = strchr(str, 0xed); 

根據編輯器的不同,您通常可以更改文件的編碼,例如, Vim中

set fenc=cyrillic 
set fenc=iso-8859-5 
etc. 

然後按預期

pch = strchr(pch + 1, 'н'); 

應該工作。否則,您可以通過237搜索字節值,但是,那麼文件必須是西里爾文,因爲您的輸入字符串將具有與源文件相同的編碼

除此之外;調查wchar_t可能是最好的方法。但是,再一次,所有都取決於上下文。