#include "stdio.h"
int sscanf(const char *str, const char *format, ...);
功能:
从str制定的字符串读取数据,并且根据参数format 字符串来转换并格式化数据。
参数:
str:指定的字符串首地址
format:字符串格式,用法和scanf()一样
返回值
成功:实际读取的字符个数
失败:-1
格式 | 作用 |
%*s或者%*d | 跳过指定类型(s,或者d)的数据 |
%[num]s | 读取指定宽度(num)的数据 |
%[a-z] | 读取到a到z的任意字符 |
%[aCd] | 读取a、C、d中的一员 |
%[^a] | 读取非a的任意字符 |
%[^a-z] | 读取除a-z以外的所有字符 |
\''%[^\'']\'' | 读取从\''开始,非\''的字符,到\''结束 |
例子1
void test1()
{
char *str = "123456789abcdef";
char buf[512] = {0};
sscanf(str,"%*d%s",buf);
printf("buf:%s\r\n",buf);
}
输出结果:abcdef
%*d 跳过了123456789 %s读取字符到buf
例子2:
void test2()
{
char *str = "123456789abcdef";
char buf[512] = {0};
sscanf(str,"%3s",buf);
printf("buf:%s\r\n",buf);
}
输出结果:123
%3s读取3个字符到buf
例子3:
void test3()
{
char *str = "123456789abcdef";
char buf[512] = {0};
sscanf(str,"%[^a]",buf);
printf("buf:%s\r\n",buf);
}
输出结果:空
从第一个字符开始匹配,第一个字符是1不是a直接退出了
所以将sscanf(str,"%[a-z]",buf);修改为sscanf(str,"%*d%[a-z]",buf);先跳过前面的数字,再读取字符
输出结果:abcdef
例子4:
void test4()
{
char *str = "123456789abcdef";
char buf[512] = {0};
sscanf(str,"%[aCd]",buf);
printf("buf:%s\r\n",buf);
}
输出结果:空
从第一个字符开始匹配,第一个字符是1不是a直接退出了
所以将sscanf(str,"%[aCd]",buf);修改为sscanf(str,"%*d%[a-z]",buf);先跳过前面的数字,再读取字符
输出结果:a
例子5:
void test5()
{
char *str = "123456789abcdef";
char buf[512] = {0};
sscanf(str,"%[^a]",buf);
printf("buf:%s\r\n",buf);
}
输出结果:123456789
匹配到字符a后停止,即a之前的字符
例子6:
void test6()
{
char *str = "abcdef123456789";
char buf[512] = {0};
sscanf(str,"%[^1-9]",buf);
printf("buf:%s\r\n",buf);
}
输出结果:abcdef
匹配到字符1后停止,即1之前的字符
例子7:
void test7()
{
char *str = " \''12563adnc\'' ";
char buf[512] = {0};
sscanf(str,"\''%[^\'']\''",buf);
printf("buf:%s\r\n",buf);
}
输出结果:12563adnc
匹配到字符\''后开始,匹配到\''结束
纯属个人理解,有问题即使交流