C语言scanf读取中文时一些注意事项

下面程序所运行的命令行界面的编码是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

虽然int4个字节,但是scanf%c只读取一个字符(字节),所以把读取的0xc4赋值给整型变量chch的值就是0xc4,而内存是小端表示,便是c4 00 00 00

同时,上面的scanf会出现编译时警告:warning: format '%c' expects argument of type 'char *', but argument 2 has type 'int *' [-Wformat=]

原文地址:https://www.cnblogs.com/ryzz/p/12269979.html