下面程序所运行的命令行界面的编码是GBK(代码页:936 简体中文 GBK)
char s[10];
scanf("%s",s); //输入“你好啊”,然后回车
printf("%s",s); //能正确输出“你好啊”
使用调试工具查看s所在的内存空间:
c4 e3 ba c3 b0 a1 00 00 00 00
百度查询可知“你好啊”的GBK的编码是:
你:C4E3
好:BAC3
啊:B0A1
发现和数组s的前6个字节存储的值一样,由此可知,程序所运行的命令提示符支持哪种编码,那么C可以正确存储和输出这种编码的字符。
char ch;
scanf("%c",&ch); //输入“你”,然后回车
使用调试器查看变量ch所在的内存空间:c4
scanf的%c表示读取一个字符,更确切的说是读取输入缓冲区的一个字节。
int ch;
scanf("%c",&ch); //输入“你”,然后回车
使用调试器查看变量ch所在的内存空间:c4 00 00 00
虽然int占4个字节,但是scanf的%c只读取一个字符(字节),所以把读取的0xc4赋值给整型变量ch,ch的值就是0xc4,而内存是小端表示,便是c4 00 00 00
同时,上面的scanf会出现编译时警告:warning: format '%c' expects argument of type 'char *', but argument 2 has type 'int *' [-Wformat=]