在C中过滤标点符号的最快方法

时间:2010-11-19 02:10:23

标签: c filtering

我需要在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;
}

正如您所看到的,它会遍历每个标点符号的字符串。是否有一个简单的库函数可以有效地完成所有标点符号?

2 个答案:

答案 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标点符号的正则表达式库。