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
相关产品推荐
相关产品推荐

