CLion环境下C语言scanf()读取中文后printf()输出乱码问题
CLion下C语言scanf读取中文输出乱码问题
问题复现
在CLion中编写C语言程序时,printf()输出硬编码中文字符串正常,scanf()读取控制台输入的中文字符串后再输出会显示乱码,英文字符串输入输出无异常。
测试代码:
#include"stdio.h" int main(){ printf("你好\n"); char str[10]; scanf("%s",str); printf("%s",str); }
运行结果:
- 输入中文时:
你好 你好 ��
- 输入英文时:
你好 hello hello
故障原因
乱码本质是多环节编码规则不统一:
Windows系统原生控制台默认输入、输出编码为GBK,而CLion默认使用UTF-8编码解析控制台输出内容。硬编码的中文字符串在编译阶段已经和源文件保存编码对齐,所以可以正常输出;scanf()读取控制台输入的中文时,会按照控制台默认的GBK编码将字符转为字节存入字符数组,后续printf()输出这些字节时,CLion用UTF-8规则解析GBK编码的字节流,编码不匹配就会出现乱码。
英文字符属于标准ASCII字符集范围,在GBK、UTF-8编码下的字节表示完全一致,因此不会触发乱码。
解决方法
任选一种方案统一全链路编码即可:
- 全链路统一为UTF-8
- 打开CLion设置,找到文件编码配置项,将全局编码、项目编码、控制台默认编码全部设置为UTF-8
- 在CLion对应项目的运行/调试配置中,添加环境变量
LANG=zh_CN.UTF-8 - 在main函数最开头添加Windows控制台代码页设置代码,强制控制台输入输出使用UTF-8编码:
#include <windows.h> int main(){ SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8); // 原有业务代码 printf("你好\n"); char str[10]; scanf("%s",str); printf("%s",str); return 0; }
- 全链路统一为GBK
- 打开CLion文件编码配置,将全局编码、项目编码、控制台编码全部修改为GBK
- 移除所有UTF-8相关的强制编码设置,编译时指定源文件编码参数为GBK即可
额外注意:存储中文字符串的字符数组长度要留足冗余,UTF-8编码下1个中文字符占3字节,GBK编码下1个中文字符占2字节,示例中char str[10]最多存储3个UTF-8编码的中文字符,长度不足会触发内存溢出。
内容的提问来源于stack exchange,提问作者hongwei.wang
相关产品推荐
相关产品推荐

