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 }
运行结果
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 }