sscanf 和scanf类似,都是用于输入的,不同的是,scanf是以键盘(stdin)为输入源,sscanf是以固定的字符串为输入源
用这个来分析字符串比较爽。
(一)函数语法
Int sscanf( const char * buffer, const char * format, [argument] ...);
buffer:存储的数据
format:控制字符串
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了
星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单
字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
(二)源代码测试
nt ret = 0;
char *string;char buf1[100] = {0};
char buf2[100] = {0};
char buf3[100] = {0};
int num;
string = "I am best 100";ret = sscanf(string, "%s %s %s %d", buf1, buf2, buf3, &num);
printf("ret = %d,%s-%s-%s-%d\n",ret,buf1,buf2,buf3,num);
/* 2 取指定长度的字符串 */
string = "123456789";
sscanf(string, "%5s", buf1);
printf("2_buf1=%s\n", buf1);
/* 3 取到指定字符为止的字符串 */
string = "1234/456";
sscanf(string, "%[^/]", buf1);
printf("3_buf1=%s\n", buf1);
/*4 取到指定字符集为止的字符串 */
string = "aSDDbdjj123";
sscanf(string, "%[^1-3]", buf1);
printf("4_buf1=%s\n", buf1);
/* 5 取仅仅包含字符集的字符串 */
string = "0123abcABC";
sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1,buf2,buf3);
printf("5_buf1=%s,buf2= %s,buf3=%s\n", buf1,buf2,buf3);
/* 6 获取指定字符中间的字符串 */
string = "ios<android>wp7";
sscanf(string, "%*[^<]<%[^>]", buf1);
printf("6_buf1=%s\n", buf1);
/* 7 指定要跳过的字符串 */
string = "iosVSandroid";
sscanf(string, "%[a-z]VS%[a-z]", buf1,buf2);
printf("7_buf1=%s,buf2=%s\n", buf1,buf2);
/* 8 分割以某字符隔开的字符串 */
string = "android-iphone-wp7";
sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2,buf3);
printf("8_buf1=%s,buf2=%s,buf3=%s\n", buf1, buf2,buf3);
/* 9 提取邮箱地址 */
string = "Email:beijing@sina.com";
sscanf(string, "%[^:]:%[^@]@%s", buf1, buf2, buf3);
printf("9_buf1=%s,buf2=%s,buf3=%s\n", buf1, buf2, buf3);
/* 10 过滤掉不想截取或不需要的字符串
在%后面加*号,代表过滤这个字符串,不读取
*/
string = "andriod iphone wp7";
sscanf(string, "%s %*s %s", buf1, buf2);
printf("10_buf1=%s,buf2=%s\n", buf1, buf2);
参考博文:https://blog.csdn.net/gzshun/article/details/7081736