2011-05-24 116 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; 
} 

还记得代码修改其参数。