想必大家都对scanf()函数很熟悉,即格式化输入函数,但是对sscanf()又熟悉多少??让我们一起来好好学习一下这个函数。
我们先来看一下这个函数的原型:
int sscanf(const char *str, const char *format, ...);
-
参数:
-
str
:待解析的输入字符串。 -
format
:格式字符串,定义如何解析输入。 -
...
:可变参数列表,用于存储解析结果的变量地址。
-
-
返回值:
-
成功匹配并赋值的参数数量。
-
若输入失败(如字符串为空),返回
EOF
。
-
基本用法
1. 提取基础类型(如果使用字符串裁剪是不是就很复杂了,注意此处变量传入的是地址)
char str[] = "42 3.14 Hello";
int num;
float f;
char s[20];
int count = sscanf(str, "%d %f %s", &num, &f, s);
// 结果:num=42, f=3.14, s="Hello",count=3
其中的格式说明符号我做了以下总结(这些是最基本的,也是学习C语言必须要记住的):
-
%d
:整数(十进制)。 -
%f
/%lf
:浮点数(float
/double
)。 -
%s
:字符串(遇到空白停止)。 -
%c
:单个字符(包括空格、换行)。 -
%x
:十六进制整数。 -
%o
:八进制整数。 -
%u
:无符号整数。
然后,上个强度,学学高级用法!!!!!!!!!!
1. 控制匹配宽度
防止缓冲区溢出:
char str[] = "abcdefghijk";
char buffer[5];
sscanf(str, "%4s", buffer); // 读取最多4字符,buffer="abcd"
2. 跳过部分内容
用 %*
忽略匹配项:
char str[] = "Age: 25, Height: 180";
int age, height;
sscanf(str, "Age: %d, Height: %d", &age, &height); // age=25, height=180
// 或跳过标签:
sscanf(str, "%*s %d %*s %d", &age, &height); // 同样结果
3. 匹配特定字符集
用 %[ ]
自定义字符集合:
char str[] = "abc123XYZ";
char letters[10], numbers[10];
sscanf(str, "%[a-z]%[0-9]", letters, numbers); // letters="abc", numbers="123"
%[^ ]
表示排除某些字符:
sscanf("hello-world", "%[^-]", letters); // letters="hello"
复杂示例
解析日期字符串(个人感觉这个函数用来解析日期是真好用,笑我当时还在那字符串截取给我写成智障了,哈哈)
就比如这个案例:
char date[] = "2023-10-05";
int year, month, day;
sscanf(date, "%d-%d-%d", &year, &month, &day);
// year=2023, month=10, day=5
是不是巨好使!!!!!都给我来用。。。
浅浅总结如下:
-
适用场景:适合解析结构简单的字符串(如日志行、配置项)。
-
替代方案:复杂格式建议使用
strtok
分割字符串,或正则表达式库(如regex.h
)。 -
性能:频繁解析时,注意多次调用
sscanf
可能影响效率。
掌握 sscanf
可以高效处理字符串数据,但需谨慎处理格式匹配和缓冲区安全。