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;
}