文章目录
在 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.用法
| 格式 | 作用 |
|---|---|
| %* | 跳过匹配项 |
| %[width]s | 读指定宽度的数据 |
| %[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读指定宽度的数据------%[width]s
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 能够在不修改原始字符串的前提下,完成高效的数据提取。