C 语言 sscanf 是标准库里面的格式化字符串解析函数,它和 scanf 功能逻辑很像,区别在于 scanf 是从键盘标准输入读取数据,sscanf 是从已经存放在内存里面的字符串当中,按照指定格式提取数据,把提取出来的内容转换成对应的整型浮点型字符等类型,存入传入的变量地址里面,这个函数非常适合处理已经拿到的文本数据,比如从一行文本里面拆分出数字姓名编号,不需要再等待键盘输入,是字符串拆分解析非常常用的工具,函数定义在 stdio.h 头文件当中,调用的时候第一个参数是待解析的源字符串,第二个参数是格式控制字符串,后面依次放接收变量的地址,函数执行之后会返回成功匹配并且赋值的数据项个数,如果解析失败或者提前遇到不匹配内容,返回值会小于预期的数量,这个返回值经常用来判断解析是否成功,写健壮代码的时候一定要判断返回值,不能默认解析一定成功。sscanf 支持的格式符和 scanf 基本一致,包括 d f s c 等,还支持正则风格的匹配规则,比如指定读取宽度忽略匹配内容,能够实现比较灵活的文本提取,但是它属于基础格式化解析,面对复杂不规则文本的时候能力有限,遇到格式错位就会停止匹配。
基础语法
int sscanf (const char str, const char format, ...);
参数说明
str 待解析的源字符串,也就是已经存在内存中的字符数组或者字符串指针
format 格式控制串,用来规定解析规则,和 scanf 格式写法一致
可变参数 后面依次填写接收数据变量的地址,必须加取地址符
返回值 成功完成赋值的数据项数量,匹配失败返回 EOF
使用完整步骤
第一步 在代码顶部引入头文件 include stdio.h
第二步 准备源字符串,也就是需要拆分解析的字符数组
第三步 定义用来保存提取结果的变量
第四步 编写格式控制字符串,匹配字符串里面的内容排版
第五步 调用 sscanf,传入源字符串 格式串 各个变量地址
第六步 读取 sscanf 返回值,判断解析成功项数,判断解析是否正常完成
常用格式说明
d 提取十进制整数
f 提取浮点数
s 提取连续非空白字符串,遇到空格回车制表符停止
c 读取单个字符,包含空白字符
x 读取十六进制整数
宽度限制 比如 2d 代表只读两位整数
忽略匹配 星号 匹配内容但是不保存到变量
对比表格
项目 sscanf scanf
数据来源 内存中的字符串 键盘标准输入
核心用途 预存文本拆分提取 实时键盘输入读取
头文件 stdio.h stdio.h
返回值 成功赋值项数 成功赋值项数
重点注意事项
第一 后面接收变量必须传地址,普通变量要加取地址符号,忘记取地址会造成内存错误程序崩溃
第二 格式串里面普通字符必须和源字符串严格匹配,如果格式串写了空格或者固定字符,源字符串对应位置也要存在,否则匹配中断
第三 使用 s 读取字符串的时候,没有长度限制,存在缓冲区溢出风险,建议加上读取宽度限制
第四 当源字符串内容和格式规则不匹配,sscanf 会立刻停止解析,后面变量不会赋值
第五 解析带空格的整行文本的时候,默认空白字符会被自动跳过,这点和 c 读取单个字符行为不一样
【常见问题】
问题 1 C 语言 sscanf 和 scanf 最核心差别是什么
回答 1 C 语言 sscanf 是从内存字符串里面解析提取数据,scanf 是从键盘标准输入读取,C 语言 sscanf 不需要等待用户输入,专门用来拆分已经保存好的文本内容。
问题 2 C 语言 sscanf 调用的时候变量为什么要写取地址符
回答 2 C 语言 sscanf 需要把解析得到的数据写入变量内存空间,所以必须传入变量地址,C 语言 sscanf 如果忘记取地址,函数会错误写入随机内存,引发程序崩溃异常。
问题 3 C 语言 sscanf 返回值有什么作用
回答 1 C 语言 sscanf 返回成功赋值的数据项个数,可以用来判断解析是否全部成功,如果返回值小于预期项数,就代表源字符串格式和格式控制串不匹配,解析中途失败。
【免责申明】
本文内容仅用于 C 语言基础知识学习参考,代码示例仅做原理演示,sscanf 存在缓冲区溢出风险,正式工程开发建议增加长度限制并且做好返回值校验,因编码不当造成内存异常或者解析错误,相关风险由使用者自行承担。


