#1. sscanf简介
从一个字符串中读进与指定格式相符的数据,注意和printf不同的是都用于输出,但printf以键盘为输入源,而sscanf以固定字符串为输出源。
函数原型:int sscanf (const char *str,const char * format,........);
返回值:如果成功则返回参数数目,失败则返回0
调用格式:
sscanf(源字符串,输入格式,被输入的参数)
#2. 具体用法
1)取指定长度的字符串
string = "123456789";
sscanf(string, "%5s", buf1);
printf("1.buf1=%s\n\n", buf1); //1.buf1=12345
(buff1为char[255])
2)取到指定字符为止的字符串
string = "123/456";
sscanf(string, "%[^/]", buf1);
printf("3.buf1=%s\n\n", buf1);//3.buf1=123
3)取到指定字符集为止的字符串
string = "123abcABC";
sscanf(string, "%[^A-Z]", buf1);
printf("4.buf1=%s\n\n", buf1);//4.buf1=123abc
4)取仅包含指定字符集的字符串
string = "0123abcABC";
sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);
printf("5.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);
//5.buf1=0123,buf2=abc,buf3=ABC
5)获取指定字符中间的字符串
//注意:% * d 和 % s 加了星号 () 表示跳过此数据不读入. (也就是不把此数据读入参数中)
sscanf("12345acc","%*d%s",str);
printf("str = %s\n",str);//str=acc
// 给定一个字符串“abcd&hello¥why”,现在我想取出&与¥之间的字符串怎么办呢
sscanf("abcd&hello¥why", "%*[^&]&%[^¥]", str );
// [a-z]表示读取所有a-z的字符,[ ^a-z ]表示读取所有非小写字母的字符。那么在这里%*[ ^& ]表示先过滤掉abcd,然后以&隔开,后面还剩hello¥why,然后将¥之前非¥的字符提取到str中。
6)给定一个字符串“what, time”,如果我想仅保留time,那该怎么办呢?(,后面有个空格)
sscanf(“what, time”, "%*s%s", str );
//其中%*s表示第一个被匹配到的字符串what,被过滤掉了,如果没有空格,则结果为NULL。其实“what, time”被空格分割成了两个字符串"what,“和"time”.
7)取整数
例1
int year,month,day,hour,minute,second;
sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
printf("\ntime = %d-%d-%d %d:%d:%d\n",year,month,day,hour,minute,second);
//time=2023/02/13 14:55:34
例2
string = "china beijing 123";
ret = sscanf(string, "%s %s %d", buf1, buf2, &digit);
printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit);
//1.ret=3,buf1=china,buf2=beijing,digit=123
Note:
1,sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
2,关于正则表达式:
(1)%[…],当字符属于方括号里表达式表示的字符集时继续读取,否则停止.方括号里的和正则表达式差不多,^是"排除…"的意思
(2)%*[…],直接跳过方括号里的字符集并继续读取