我需要在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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它遍历每个标点符号的字符串.是否有一个简单的库函数可以有效地完成所有标点符号?
更有效的算法是:
#include <ctype.h>
char *filter(char *mystring)
{
char *in = mystring;
char *out = mystring;
do {
if (!ispunct(*in))
*out++ = *in;
} while (*in++);
return mystring;
}
Run Code Online (Sandbox Code Playgroud)
它不是特定于UTF-8的 - 它是当前的语言环境.(您的原始版本也不是特定于UTF-8).
如果你想把它变成UTF-8,你可以ispunct()用一个函数代替char *它,并确定它是否以一个(可能是多字节的)UTF-8字符开头,这个字符是某种标点符号(并用它来in代替*in).