sscanf函数的用法(高级进阶用法/正则表达式/贪婪性)

本文围绕Linux环境下的sscanf函数展开,介绍了其包含的头文件,详细说明了函数语法,包括参数含义、返回值情况。还阐述了基础用法,即从已知字符串格式化匹配有效信息,以及高级用法,如跳过数据、读取指定宽度数据等。

目录

1. 包含头文件

2. 函数语法:

3. 基础用法

4. 高级用法


1. 包含头文件

#include <stdio.h>

2. 函数语法:

int sscanf(const char *str, const char *format, ...);
说明:
str: 待解析的字符串;
format: 字符串格式,可以是一个或多个 {%[*] [width] [{h | I | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}; 

  • * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
  • {a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
  • width表示读取宽度。
  • {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
  • type :这就很多了,就是%s,%d之类。
  • 特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值,失败返回0 ,否则返回格式化的参数个数
  • 如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

返回值:返回成功赋值的个数;返回值为 0 表示没有将任何字段赋值。成功则返回参数数目,失败则返回-1,错误原因存于errno中;

3. 基础用法

将已知的字符串通过格式化匹配出有效信息。sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

读取整数:

#include <stdio.h>
int main(void)
{
    char string[] = "123";
    int value;
    sscanf(string,"%d", &value);
    printf("value=%d\n", value);
    return 0;
}
输出结果: value=123

读取字符串:

#include <stdio.h>
int main(void)
{
    char string[] = "hello world";
    char c1[16];
    char c2[16];
    sscanf(string,"%s%s",c1, c2);
    printf("c1=%s, c2=%s\n", c1, c2);
    return 0;
}
输出结果: c1=hello, c2=world

4. 高级用法

  • %*s或%*d 跳过数据
  • %[width]s 读指定宽度的数据
  • %[a-z] 匹配a到z中任意字符(尽可能多的匹配)
  • %[abc] 匹配a、b、c中一员,贪婪性
  • %[^a] 匹配非a的任意字符,贪婪性
  • %[^a-z] 表示读取除a-z以外的所有字符

解析固定宽度:

#include <stdio.h>
int main(void)
{   
    unsigned int info = 0;
    char *ptr = &info;
    if(sscanf("192.168.1.10", "%hhu.%hhu.%hhu.%hhu", &ptr[0], &ptr[1], &ptr[2], &ptr[3]) != 4)
    {
        printf("parse faild\n");
    }
    else
    {
        printf("info = %hhu %hhu %hhu %hhu\n", ptr[0], ptr[1], ptr[2], ptr[3]);
    }
    return 0;
}
运行结果:info = 192 168 1 10

读取IP:

#include <stdio.h>
int main(void)
{
    char string[] = "192.168.1.10/24, 192.168.1.254";
    char address[16] = {0};
    char mask[16] = {0};
    char gateway[16] = {0};
    sscanf(string, "%[^/]/%[^,],%s", address, mask, gateway);
    printf("address=%s\n", address);
    printf("mask=%s\n", mask);
    printf("gateway=%s\n", gateway);
    return 0;
}
输出结果:
address=192.168.1.10
mask=24
gateway=192.168.1.254
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech Embedded

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值