2011-05-24 63 views
2

我有一個帶有UTF8數據的緩衝區。我需要刪除前導和尾隨空格。 這裏是C代碼做它(到位)爲ASCII緩衝區: 修剪UTF8緩衝區

 
char *trim(char *s) 
{ 
    while(isspace(*s)) 
    memmove(s, s+1, strlen(s)); 
    while(*s && isspace(s[strlen(s)-1])) 
    s[strlen(s)-1] = 0; 
    return s; 
} 

如何做UTF8緩衝同在C/C++?
P.S. 感謝您對strlen()的性能提示。具體回到UTF8:如果我需要一起刪除所有空間,不僅在開始和尾部,會怎麼樣?此外,我可能需要刪除所有字符與ASCII碼< 32.這裏有任何具體的UTF8的情況下,就像使用mbstowcs()?

回答

4

你是否想要刪除所有的Unicode空格,或只是ASCII空格?在後一種情況下,您根本不需要修改代碼。

在任何情況下,您使用的方法反覆調用strlen效率極低。它將一個簡單的O(n)操作變成至少O(n^2)

編輯:這裏有一個更新的問題的一些代碼,假設你只想要去除ASCII空格和控制字符:

unsigned char *in, *out; 
for (out = in; *in; in++) if (*in > 32) *out++ = *in; 
*out = 0; 
+0

注意到O(n^2) – 2011-05-24 02:40:56

+0

除了多次調用'strlen'之外,更不用說移動整個字符串(前面的空格數量)時間 – Bwmat 2011-05-24 02:41:20

+1

,所有對'memmove'的調用也沒有多大幫助。 – Marlon 2011-05-24 02:41:50

3

的strlen()掃描到字符串的結尾,因此調用它的多個次,就像你的代碼一樣,效率很低。

嘗試尋找第一個非空格和最後一個非空格,然後將的memmove子:

char *trim(char *s) 
{ 
    char *first; 
    char *last; 

    first = s; 
    while(isspace(*first)) 
    ++first; 

    last = first + strlen(first) - 1; 
    while(last > first && isspace(*last)) 
    --last; 

    memmove(s, first, last - first + 1); 
    s[last - first + 1] = '\0'; 

    return s; 
} 

還記得代碼修改其參數。