2014-12-23 132 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用于调试目的。

问题是,如果字符串是“3/4”,如果字符串是“3/4”,则输出为“发现:¼”,如果字符串为“¾”,则输出为“发现:¾”。但对于“¾”我期望输出为NULL,因为搜索到的模式不在字符串中。为什么不是这种情况?我该如何改变它?

原因可能是¼不是“正常”字符?

谢谢你的帮助!

+0

这部分似乎是自相矛盾的:““发现:¼”如果字符串是“¼”和“发现:¾”如果字符串是“¾”。但对于“¾”我期望输出为NULL,因为搜索到的模式不在字符串中' – D3Hunter

回答

2

strpbrk()不支持多字节编码。

最有可能在您的源代码中的¼¾被编码为UTF-8,但在运行时解释为ASCII。

的UTF-8编码为两个角色:

0xC2 0xBC 
0xC2 0xBE 

因为它们都有一个共同的ASCII “字符”,0xC2strpbrk()将返回比NULL以外的东西。

+0

谢谢您的回答。这是否意味着我不能使用strpbrk来处理这些字符?有其他选择吗? – user1894572

+0

@ user1894572:此*威力*有用:http://www.gnu.org/software/libunistring/manual/libunistring.html – NPE

+0

感谢您快速的帮助! – user1894572

相关问题