我需要在C中快速过滤来自UTF-8字符串的标点符号。字符串可能很长而且数量很多。我目前使用的功能效率非常低:
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 :(得分: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)
ICU库具有C绑定,并包含正确处理Unicode \pP
标点符号的正则表达式库。