使用C语言scanf读取韩文字符串后输出为空的问题求助
问题分析与解决方案
你的问题出在C标准库默认locale设置和scanf("%s")的字符处理限制上:
- 默认的
Clocale仅支持ASCII字符,无法识别韩文这类多字节Unicode字符(通常以UTF-8编码,每个字符占2-3字节)。 scanf("%s")虽能读取字节流,但在非ASCII locale下,无法正确解析多字节字符的边界,导致输出时无法正常显示内容。
解决方案1:使用宽字符类型与宽字符IO函数
宽字符(wchar_t)直接处理Unicode字符,配合对应的宽字符输入输出函数,能更好地适配多语言场景:
#include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { // 启用系统默认locale,支持当前系统的字符编码(如UTF-8) setlocale(LC_ALL, ""); wchar_t name[50]; wprintf(L"What's your name? "); // %ls用于读取宽字符串 wscanf(L"%ls", name); wprintf(L"Hello, %ls!", name); return 0; }
解决方案2:保持char数组,修正locale并改用可靠输入方式
如果想继续用char数组存储UTF-8字符串,只需设置正确的locale,并改用fgets读取整行(避免scanf("%s")遇到空格就截断的问题):
#include <stdio.h> #include <locale.h> #include <string.h> int main(void) { // 切换到系统默认locale setlocale(LC_ALL, ""); char name[50]; printf("What's your name? "); // 读取整行输入,支持带空格的姓名 fgets(name, sizeof(name), stdin); // 移除fgets读取到的末尾换行符 name[strcspn(name, "\n")] = '\0'; printf("Hello, %s!", name); return 0; }
Windows系统额外注意事项
Windows控制台默认编码可能不是UTF-8,可通过两种方式调整:
- 运行程序前,在控制台输入
chcp 65001切换到UTF-8编码。 - 在代码中添加Windows API调用强制设置编码:
#include <windows.h> // 在main函数开头添加 SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8);
内容的提问来源于stack exchange,提问作者user22509975
相关产品推荐
相关产品推荐

