我有一个包含UTF8数据的缓冲区。我需要删除前导和尾随空格。
这是用于ASCII缓冲区的C代码(就地):
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;
}
如何在C / C ++中对UTF8缓冲区执行相同的操作?
附:
感谢关于strlen()的性能提示。回到UTF8具体:如果我需要一起删除所有空格,不仅仅是在开头和尾部怎么办?此外,我可能需要删除ASCII码<32的所有字符。这是针对UTF8的具体情况,比如使用mbstowcs()吗?
答案 0 :(得分: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;
答案 1 :(得分:3)
strlen()扫描到字符串的末尾,因此在代码中多次调用它是非常低效的。
尝试寻找第一个非空格和最后一个非空格,然后记下子字符串:
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;
}
还记得代码修改了它的参数。