下面程序所運行的命令行界面的編碼是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=]