2014-12-23 2 views
1

сначала я хочу сказать, что я довольно новичок в C. У меня проблема с функцией strpbrk.strpbrk не ведет себя так, как ожидалось

Моя функция получает строку. Если эта строка содержит «¼», она должна что-то сделать, если она содержит «¾», она должна делать что-то еще.

static char* format_date_string3(char *string) { 
    printf("Found: %s\n", strpbrk(string, "¼")); 
    if (strpbrk(string, "¼") != NULL) { 
     //do something 
    } else if (strpbrk(string, "¾") != NULL) { 
     //do something else 
    } 
} 

Я добавил printf для целей отладки.

Проблема заключается в том, что выход «Найдено: ¼», если строка была «¼» и «Найдено: ¾», если строка была «¾». Но для «¾» я ожидал, что вывод будет NULL, поскольку искомый шаблон отсутствует в строке. Почему это не так? Как я могу его изменить?

Возможно ли, что ¼ не являются «нормальными» символами?

Благодарим за помощь!

+0

Эта часть кажется противоречивой: «Найдено: ¼», если строка была «¼» и «Найдено: ¾», если строка была «¾». Но для «¾» я ожидал, что выход будет NULL, так как найденный шаблон не находится в строке « – D3Hunter

ответ

2

strpbrk() не поддерживает многобайтовые кодировки.

Скорее всего, ¼ и ¾ в вашем исходном коде кодируются как UTF-8, но интерпретируются во время выполнения как ASCII.

В UTF-8 кодировок для двух персонажей:

0xC2 0xBC 
0xC2 0xBE 

Поскольку они имеют общий ASCII "характер", 0xC2, strpbrk() возвращается что-то иное, чем NULL.

+0

Спасибо за ваш ответ. Означает ли это, что я не могу использовать strpbrk для этих персонажей? Есть ли альтернатива? – user1894572

+0

@ user1894572: Этот * может * быть полезным: http://www.gnu.org/software/libunistring/manual/libunistring.html – NPE

+0

Спасибо за вашу быструю помощь! – user1894572

Смежные вопросы