C语言中的sscanf用法详解

文章目录

在 C/C++ 开发中,字符串往往是配置文件、日志信息、协议数据和命令行参数等信息的主要载体。如何从一段普通字符串中 高效、准确地提取结构化数据 ,是底层编程和工程实践中经常遇到的问题。相比直接使用 scanf 从标准输入读取数据, sscanf 提供了一种更加灵活且可控的方式:它允许程序 按照指定格式,从内存中的字符串解析数据 。

1.函数原型

cpp 复制代码
#include <stdio.h>

int sscanf(const char *str, const char *format, ...);
参数 含义
str 输入字符串(被解析的内容)
format 格式字符串(解析规则)
... 接收解析结果的变量地址

返回值:

成功匹配并赋值的"字段个数"

示例1:解析整数

cpp 复制代码
char buf[] = "123 456";
int a, b;
int ret = sscanf(buf, "%d %d", &a, &b);

printf("ret=%d, a=%d, b=%d\n", ret, a, b);

输出:

含义:

  • 成功解析 2 个字段
  • ret == 2 表示成功

2.用法

格式 作用
%* 跳过匹配项
%widths 读指定宽度的数据
%a-z 匹配a到z中任意字符(尽可能多的匹配)
%aBc 匹配a、B、c中一员,贪婪性
%\^a 匹配非a的任意字符,贪婪性
%\^a-z 表示读取除a-z以外的所有字符
%f, %lf 读取浮点数(float,double)

2.1跳过匹配项

cpp 复制代码
void test02() {
    char buf[] = "123hello";
    int a;
    sscanf(buf, "%d%*s", &a); // 跳过字符串部分
    printf("a=%d\n", a);

}

输出:

cpp 复制代码
void test03(){
    char buf[] = "123 hello"; // 注意这里有空格
    char a[10];
    sscanf(buf, "%*d%s", a); // 跳过数字部分
    printf("a=%s\n", a);
}

输出:

2.2读指定宽度的数据------%widths

cpp 复制代码
//4. 读取指定宽度数据
void test04(){
	char buf[1024] = { 0 };
	//跳过前面的数字
	sscanf("123456aaaa", "%7s", buf);
	printf("buf:%s\n", buf);
}

输出:

2.3匹配a到z中任意字符(尽可能多的匹配)------%a-z

cpp 复制代码
//5. 匹配a-z中任意字符
void test05(){
    char buf[] = "abcdef147258"; 
    char a[10];
    sscanf(buf, "%*[a-z]%s", a); // 跳过非数字部分
    printf("a=%s\n", a);
}

输出:

2.4匹配a、B、c中一员,贪婪性------%aBc

cpp 复制代码
//6. 匹配aBc中的任何一个
void test06(){
	char buf[1024] = { 0 };
	//跳过前面的数字
	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
	sscanf("abcdefg123456", "%[aBc]", buf);
	printf("buf:%s\n", buf);
}

输出:

2.5匹配非a的任意字符,贪婪性------%\^a

cpp 复制代码
//5. 匹配非a的任意字符
void test07(){
	char buf[1024] = { 0 };
	//跳过前面的数字
	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
	sscanf("bcdefag123456", "%[^a]", buf);
	printf("buf:%s\n", buf);
}

输出:

2.6表示读取除a-z以外的所有字符------%\^a-z

cpp 复制代码
//8. 匹配非a-z中的任意字符
void test08(){
	char buf[1024] = { 0 };
	//跳过前面的数字
	//先匹配第一个字符是否是aBc中的一个,如果是,则匹配,如果不是则停止匹配
	sscanf("123456ABCDbcdefag", "%[^a-z]", buf);
	printf("buf:%s\n", buf);
}

输出:

2.7综合应用:

cpp 复制代码
//实战案例:编码实现匹配myname
void test09(){
    char buf[] = "12356abcd$myname@000qwe";
    char name[100];
    sscanf(buf, "%*[^$]$%[^@]", name);
    printf("%s\n", name);
}

输出:

3.总结

sscanf 是 C/C++ 中用于字符串解析的重要工具,其核心价值在于将文本数据按格式映射为程序中的变量 。通过合理设计格式字符串并严格检查返回值,sscanf 能够在不修改原始字符串的前提下,完成高效的数据提取。

相关推荐
刚入门的大一新生3 小时前
Linux-线程互斥
java·开发语言
香芋芋圆4 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
揽星河..4 小时前
【C语言】分支和循环
c语言·c++·算法
小熊恋旧4 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合4 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J4 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net5 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央5 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>5 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
努力努力再努力wz6 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua