介绍一个强大的C语言字符串解析函数--sscanf()

想必大家都对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 可以高效处理字符串数据,但需谨慎处理格式匹配和缓冲区安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值