C语言 sscanf库函数

sscanf函数用于解析字符串并按指定格式转换数据。基础应用包括按分隔符提取信息和字符串转换为整数。高级应用展示了如何跳过数据、取反匹配以及限定宽度的字符提取。示例代码演示了从文件读取逗号分隔的数值并存储为浮点型数组。
摘要由CSDN通过智能技术生成

1. 函数描述

(1)函数功能:
通常被用来解析并转换字符串,从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据
(2)函数原型:

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);

参数说明:

  • str:待解析的字符串;
  • format:字符串格式描述;
  • 其后是一序列数目不定的指针参数,存储解析后的数据。

返回值:
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

2. 函数应用

2.1 基础应用

(1)按分隔符提取(空格/逗号等)

// 按空格提取
int day, year;
char weekday[20], month[20], dtm[100];

strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );
printf("%s %d, %d = %s\n", month, day, year, weekday );

// 按逗号分隔提取
int i,j,k,m;

sscanf("0,0,40,0", "%d, %d, %d, %d", &i,&j,&k,&m);
printf("%d,%d,%d,%d\r\n", i,j,k,m);

输出结果:

March 25, 1989 = Saturday
0,0,40,0

(2)字符串提取转换为整数

int year=0, month=0, day=0;

sscanf("20230224", "%04d%02d%02d", &year, &month, &day);
printf("year=%d, month=%d, day=%d\r\n", year, month, day);

输出结果:

year=2023, month=2, day=24

"%04d%02d%02d"是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。

2.2 高级应用

类似于正则表达式:

格式作用
%*s或%*d跳过字符串或数字
%[width]s读取指定宽度的数据
%[a-z]匹配a到z中任意字符
%[0-9]匹配0到9中任意字符
%[aBc]匹配a、B、c中一员,贪婪性
%[^a]匹配非a的任意字符,贪婪性
%[^a-z]读取除a-z以外的所有字符

(1)* 忽略数据

char str[100];
//匹配第一个字符是否是数字,如果是,则跳过
//如果不是则停止匹配
sscanf("123qq456hello", "%*d%s", str);
printf("str:%s\r\n", str);

输出结果:

str:qq456hello

(2)^ 取反

char str[32] = "";
sscanf("123456abcdedf", "%31[^a-z]", str);
printf("str=%s/n", str);

输出结果:

str=123456

在[]中增加表示相反的意思,上面的[a-z]表示一个不包含任何a-z之间的字符串。
(3)[0-9] [a-z]

char str[32] = "";
sscanf("123456abcdedf", "%31[0-9]", str);
printf("str=%s/n", str);

输出结果:

str=123456

上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度。
(4)应用案例
功能需求:从文件中读取数据,每行数据(如0, 0, 40, 0)使用逗号分隔并转化为浮点型存入数组中。

int main()
{
    int i = 0;
    FILE *f;
    char data[200] = {0};
    char *str;
    double fir_arry[16][4] = {0};

    f = fopen("test.log", "r");

    if(f == NULL)
    {
        PRINT_WARNING("File open failed.");
    }

    for(int j = 0; j < 16; j++)
    {
        fgets(data, 100, f);
        str = strtok(data, ",");
        i = 0;
        while(str != NULL)
        {
            sscanf(str, "%lf", &fir_arry[j][i]);
            // PRINT_INFO("data get is %lf", fir_arry[j][i]);
            i++;
            str = strtok(NULL, ",");
        }
    }
    fclose(f);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

la_fe_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值