函数原型:int sscanf(const char *str, const char *format, ...);
-
str:待解析的字符串
-
format:字符串的格式描述
-
...:不定参数,存放解析后的字符串
包含头文件:<stdio.h>
功能:解析字符串
返回值:成功匹配并赋值的参数个数
注意事项:vs2022中需要提前定义 #define _CRT_SECURE_NO_WARNINGS,防止平台认为sscanf函数不安全而产生的报错问题
常见用法:
1、字符串解析结果放入整形变量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year, month, day;
int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day);
printf("成功匹配并赋值的参数个数=%d\n年份=%d\n月份=%d\n日期=%d\n", converted, year, month, day);
return 0;
}
2、字符串解析结果放入数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char str[32] = "";
sscanf("123456abcdedf", "%31[0-9]", str);//只能向str数组中存入0~9这几个字符
printf("str=%s\n", str);
return 0;
}
- %31表示能读取字符数组的最大长度,需要人为选择添加否则容易出现缓冲区溢出问题
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char str[32] = "";
sscanf("123456abcdedf", "%31[0-9a-z]", str);//只能向str数组中存入0~9这几个字符
printf("str=%s\n", str);
return 0;
}
向[]中新增了一个选择条件,现在可以向字符串中添加0~9和a~z,如果此时使用^就可以达到相反效果,即向字符数组中添加的内容不包含[]中指定的字符
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char str[32] = "";
sscanf("123456abcdedf", "%31[^a-z]", str);//只能向str数组中存入0~9这几个字符
printf("str=%s\n", str);
return 0;
}
- 被*修饰的[]会在解析时被忽略,不会存放[]中的解析结果,且sscanf函数返回-1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char str[32] = "";
int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
printf("ret=%d, str=%s\n", ret, str);
return 0;
}
~over~