我尝试解析文本并查找其中的某些字符。我使用以下代码。它能处理像abcdef
这样的普通字符,但无法处理öçşğüı
。GCC会给出编译警告。我该怎么做才能处理öçşğüı
?
代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{
char * text = "öçşğü";
int i=0;
text = strdup(text);
while (text[i])
{
if(text[i] == 'ö')
{
printf("ö \n");
}
i++;
}
return 0;
}
警告:
warning: multi-character character constant [-Wmultichar]
warning: comparison is always false due to limited range of data type [-Wtype-limits]
当我在while循环中打印char地址时,会有10个地址
printf("%d : %p \n", i, text[i]);
输出:
0 : 0xffffffc3
1 : 0xffffffb6
2 : 0xffffffc3
3 : 0xffffffa7
4 : 0xffffffc5
5 : 0xffffff9f
6 : 0xffffffc4
7 : 0xffffff9f
8 : 0xffffffc3
9 : 0xffffffbc
并且 strlen
的长度是10。
但是如果我使用 abcde
:
0 : 0x61
1 : 0x62
2 : 0x63
3 : 0x64
4 : 0x65
并且strlen
的长度为5。
如果我使用wchar_t
进行文本输出,则
0 : 0xa7c3b6c3
1 : 0x9fc49fc5
2 : 0xbcc3
而 strlen
是 10,wcslen
是 3。
oe
作为输入代替ö
。 - Arc676wchar_t
替代char
。在所有字符串字面量和字符字面量上使用L
后缀。使用wcslen
替代strlen
。 - Lundinwscmp
来进行比较。 - ameyCU\"
。编译器需要特殊逻辑来处理它——只是为了追求严谨。在注释中也应该可以正常工作(包括 K&R 和 ANSI)。OP 无法编译,因为他使用单引号而不是双引号(例如,一个 utf8 代码点是 1-4 个字符)。根据诊断,编译器理解 utf8 很好。OP 有错误的代码,他的自我回答也没有改善多少。 - Craig Estey