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

Kea*_*her 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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

caf*_*caf 9

更有效的算法是:

#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).