04 Windows编程——Unicode

VS 2017下源码

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     char ASC_a = 'a';
 6     char *ASC_str = "hello";
 7     wchar_t W_a = 'a';
 8     wchar_t *W_str = "hello";
 9     printf("ASC_a = %c\n", ASC_a);
10     printf("sizeof(ASC_a) = %d\n", sizeof(ASC_a));
11     printf("ASC_str = %s\n", ASC_str);
12     /* 打印ASC_a的内存 */
13     printf("ASC_a = 0x%x\n", &ASC_a);
14 
15     printf("W_a = %c\n", W_a);
16     printf("sizeof(W_a) = %d\n", sizeof(W_a));
17     printf("W_str = %s\n", W_str);
18     /* 打印W_a的内存 */
19     printf("W_a = 0x%x,0x%x\n", *((char*)&W_a), *(((char*)&W_a)+1));
20 
21     getchar();
22     return 0;
23 }
View Code

运行结果

wchar_t *W_str = "hello"; 

对于宽字符串,如果使用printf("W_str = %s\n", W_str);可能不会打印出完整的字符串,而只显示第一个字符。

其原因是因为:宽字符占用2Byte,第二个字节就是\0。printf以为自己到头了,所以只打印一个字节。对printf使用%S参数,或者使用wprintf来避免这一问题。我手上的是VS 2017,使用printf("W_str = %s\n", W_str);居然也可以正常打印,其他版本的VS估计不行。

如果是其他版本的VS,可能需要在宽字符前面加L,打印宽字符串需要使用%S。这时候源码如下

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     char ASC_a = 'a';
 6     char *ASC_str = "hello";
 7     wchar_t W_a = L'a';
 8     wchar_t *W_str = L"hello";
 9     printf("ASC_a = %c\n", ASC_a);
10     printf("sizeof(ASC_a) = %d\n", sizeof(ASC_a));
11     printf("ASC_str = %s\n", ASC_str);
12     /* 打印ASC_a的内存 */
13     printf("ASC_a = 0x%x\n", &ASC_a);
14 
15     printf("W_a = %c\n", W_a);
16     printf("sizeof(W_a) = %d\n", sizeof(W_a));
17     printf("W_str = %S\n", W_str);
18     /* 打印W_a的内存 */
19     printf("W_a = 0x%x,0x%x\n", *((char*)&W_a), *(((char*)&W_a)+1));
20 
21     getchar();
22     return 0;
23 }
View Code

猜你喜欢

转载自www.cnblogs.com/kelamoyujuzhen/p/9298591.html
04