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

C语言使用scanf读取字符时触发段错误的原因与解决方法

故障原因

段错误由scanf参数的语法错误直接导致:

  • C 语言语法规则里,单引号'包裹的内容是字符常量,本质是整数值;而scanf的第一个入参要求是const char*类型的格式字符串,必须用双引号"包裹,传入字符串首地址。
  • 代码中写的'%c'属于多字符字符常量,会被解析为一个整数值,传入scanf后函数会把这个整数值当成内存地址去读取格式串,直接触发非法内存访问。这个崩溃发生在scanf执行读入用户输入的逻辑之前,和缓冲区溢出、未传入变量地址这类常见scanf故障的成因完全不同,所以常规修复方案都不生效。
修复方案

将scanf调用处包裹格式符的单引号替换为双引号即可,修正后的可运行代码如下:

#include <stdio.h>
int main(int argc, const char * argv[]) {
    char piece_type;

    printf("Enter piece type (k, b, p):\n");
    scanf("%c", &piece_type);
    /* 其余业务逻辑 */

    return 0;
}

排查提示:这类引号误用属于C基础语法的细节坑,编译时开启-Wall警告选项,编译器会直接提示“整数到指针的隐式转换”类警告,不需要等到运行时触发段错误再定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:15:32