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

使用C语言scanf读取韩文字符串后输出为空的问题求助

问题分析与解决方案

你的问题出在C标准库默认locale设置和scanf("%s")的字符处理限制上:

  • 默认的C locale仅支持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,可通过两种方式调整:

  1. 运行程序前,在控制台输入chcp 65001切换到UTF-8编码。
  2. 在代码中添加Windows API调用强制设置编码:
#include <windows.h>
// 在main函数开头添加
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);

内容的提问来源于stack exchange,提问作者user22509975

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:52:18