2010-11-19 80 views
4

我需要在C中快速過濾來自UTF-8字符串的標點符號。字符串可能很長,而且數量很多。我使用的是目前的功能似乎非常低效:在C中過濾標點符號的最快方法

char *filter(char *mystring){ 
    char *p; 
    while ((p = strchr(mystring,'.')) != NULL) 
     strcpy(p, p+1); 
    while ((p = strchr(mystring,',')) != NULL) 
     ...etc etc etc... 
    ...etc... 
    return mystring; 
} 

正如你可以看到它通過串每個標點符號迭代。是否有一個簡單的庫函數可以爲所有標點符號高效地完成此操作?

+0

你使用什麼編譯器? (gcc提供了一個正則表達式模塊),搜索'C中的正則表達式'以獲得一個非常詳細的可能列表 – KevinDTimm 2010-11-19 02:20:23

+1

坦白地說,我對自己感到失望(自我鞭commence開始)。我在一段時間內並沒有每天使用C語言,而ispunct是更好的選擇。我將離開我以前的評論,以表彰我對依賴不必要的臃腫方法的敬意,因爲簡單的工作可以很好地完成。 – KevinDTimm 2010-11-19 02:52:38

回答

9

一個更高效的算法是:

#include <ctype.h> 

char *filter(char *mystring) 
{ 
    char *in = mystring; 
    char *out = mystring; 

    do { 
     if (!ispunct(*in)) 
      *out++ = *in; 
    } while (*in++); 

    return mystring; 
} 

它不是具體的UTF-8,但 - 這是任何當前區域是。 (你的原始文件也不是UTF-8)。

如果你想使UTF-8,你可以取代ispunct()與將採取char *,並確定一個函數,如果它有一個(潛在的多字節)開始UTF-8字符的某種標點符號(並用in而不是*in來稱呼它)。

+1

+1。您的代碼將很樂意使用UTF-8文本,但只能刪除所有在7位ASCII頁面中的由'ispunct()'識別的標點符號。這是UTF-8的很好功能。當然,如果OP真的需要抓住希臘,俄羅斯,韓國和泰國的標點符號,那麼他們必須處理以UTF-8編碼的實際Unicode編碼點。 – RBerteig 2010-11-19 02:28:00

+0

這是如此精美簡潔:) +1 – KeatsKelleher 2010-11-19 03:30:55

+0

發現一個小問題。在返回之前循環完成後,需要將空終止符附加到字符串: * out ='\ 0'; – KeatsKelleher 2010-11-20 16:57:58

1

ICU庫具有C綁定,並且包含正確處理Unicode的正則表達式庫\pP標點符號。

相關問題