Tôi cố gắng phân tích văn bản và tìm một số ký tự trong đó. Tôi sử dụng mã dưới đây. Nó hoạt động với các ký tự bình thường như abcdef
nhưng nó không hoạt động với öçşğüı
. GCC đưa ra cảnh báo biên dịch. Tôi nên làm gì để làm việc với öçşğüı
?Cách so sánh các ký tự nhiều byte trong C
Code:
#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;
}
Cảnh báo:
warning: multi-character character constant [-Wmultichar]
warning: comparison is always false due to limited range of data type [-Wtype-limits]
Có 10 địa chỉ khi tôi in địa chỉ của char trong vòng lặp while
printf("%d : %p \n", i, text[i]);
đầu ra:
0 : 0xffffffc3
1 : 0xffffffb6
2 : 0xffffffc3
3 : 0xffffffa7
4 : 0xffffffc5
5 : 0xffffff9f
6 : 0xffffffc4
7 : 0xffffff9f
8 : 0xffffffc3
9 : 0xffffffbc
và strlen
là 10.
Nhưng nếu tôi sử dụng abcde
:
0 : 0x61
1 : 0x62
2 : 0x63
3 : 0x64
4 : 0x65
và strlen
là 5.
Nếu tôi sử dụng wchar_t
cho đầu ra văn bản được
0 : 0xa7c3b6c3
1 : 0x9fc49fc5
2 : 0xbcc3
và strlen
là 10, wcslen
là 3.
Tôi nghĩ đó là bởi vì umlauts được coi là một nhân vật khác. Bạn có thể phải kiểm tra chuỗi thực tế thay vì ký tự hoặc lấy 'oe' thay vì' ö' làm đầu vào. – Arc676
llvm đưa ra một lỗi rõ ràng: ký tự quá lớn để kèm theo ký tự kiểu chữ nếu (văn bản [i] == 'ö') –
'strncmp()' có thể hữu ích. – MikeCAT