You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    1. 打开CLion设置,找到文件编码配置项,将全局编码、项目编码、控制台默认编码全部设置为UTF-8
    2. 在CLion对应项目的运行/调试配置中,添加环境变量LANG=zh_CN.UTF-8
    3. 在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
    1. 打开CLion文件编码配置,将全局编码、项目编码、控制台编码全部修改为GBK
    2. 移除所有UTF-8相关的强制编码设置,编译时指定源文件编码参数为GBK即可

额外注意:存储中文字符串的字符数组长度要留足冗余,UTF-8编码下1个中文字符占3字节,GBK编码下1个中文字符占2字节,示例中char str[10]最多存储3个UTF-8编码的中文字符,长度不足会触发内存溢出。

内容的提问来源于stack exchange,提问作者hongwei.wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:24:34