Самый быстрый способ фильтрации знаков препинания в C - PullRequest
4 голосов
/ 19 ноября 2010

Мне нужно быстро отфильтровать знаки препинания из строк UTF-8 в C. Строки могут быть длинными и их достаточно много. Функция, которую я сейчас использую, кажется очень неэффективной:

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 ]

9 голосов
/ 19 ноября 2010

Более эффективный алгоритм:

#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 голос
/ 19 ноября 2010

Библиотеки ICU имеют привязки C и включают в себя библиотеку регулярных выражений, которая правильно обрабатывает Unicode \pP пунктуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...