sscanf() -格式化输入(从指定字符串中把符合指定格式的数据存放到对相应的参数中)
函数原型:
int fscanf ( FILE *stream, char const *format, . . . );
int sscanf( string str, string format, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
int sscanf( string str, string format, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
说明:
返回值:
失败返回0 ,否则返回格式化的参数个数
f-file; s-string
fscanf():以指定文件为输入源
sscanf():
以固定字符串为输入源
scanf():以标准(stdin)为输入源,默认输入设备键盘
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
支持集合操作: (集合默认处理字符串后不用加s)
%[a-z] 结果只保存a到z中任意字符
%[aB'] 匹配a、B、'中一员
%[^a] 匹配从字符串开始到非a的任意字符
%[a-z] 结果只保存a到z中任意字符
%[aB'] 匹配a、B、'中一员
%[^a] 匹配从字符串开始到非a的任意字符
%*[a-z]
其中集合操作也支持*过滤。
{h|I|I64|L}:参数的size,通常h表示单字节size,I表示2字节 size,
L表示4字节size(double例外),l64表示8字节size。
L表示4字节size(double例外),l64表示8字节size。
例子:
1. 常见用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456 | sscanf=1;
1. 常见用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456 | sscanf=1;
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234 |sscanf=1
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234 |sscanf=1
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456 |sscanf=1
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf |sscanf=1
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf |sscanf=1
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456 |sscanf=1
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf |sscanf=1
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf |sscanf=1
下面这个还有意思仔细理解下:
6、给定一个字符串
iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非
'@'的一串内容送到buf中
sscanf(" iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF |sscanf=1
sscanf(" iios/12DDWDFF@122 ", "%[^/]/%[^@]", buf1,buf2);
printf("%s\n", buf1);
sscanf(" iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF |sscanf=1
sscanf(" iios/12DDWDFF@122 ", "%[^/]/%[^@]", buf1,buf2);
printf("%s\n", buf1);
printf("%s\n", buf1);
结果:buf1=iios ;
buf2=/12DDWDFF | sscanf=2
由此我们可以得出结论,format中格式符%是从前一个格式符%处理到的字符下一个字符开始处理字符串,而不是从新开始处理字符串。
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world |sscanf=1
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
8、
char *s="1try234delete5"
则:
sscanf(s, "1%[^2]234%[^5]", s1, s2); |sscanf=2
scanf的format中出现的非转换字符(%之前或转换字符之后的字符),即此例中的1234用来跳过输入中的相应字符;
‘[]’的含义与正则表达式中相同,表示匹配其中出现的字符序列;^表示相反。使用[ ]时接收输入的变量必须是有足够存储空间的char、signed char、unsigned char数组。记住[也是转换字符,所以没有s了。
printf("%s\n", buf);
结果为:world |sscanf=1
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
8、
char *s="1try234delete5"
则:
sscanf(s, "1%[^2]234%[^5]", s1, s2); |sscanf=2
scanf的format中出现的非转换字符(%之前或转换字符之后的字符),即此例中的1234用来跳过输入中的相应字符;
‘[]’的含义与正则表达式中相同,表示匹配其中出现的字符序列;^表示相反。使用[ ]时接收输入的变量必须是有足够存储空间的char、signed char、unsigned char数组。记住[也是转换字符,所以没有s了。
8、分割以某字符标记的字符串。()
char test[]="111,222,333,444,555,666,777";
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4];
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7);
printf("sssa1=%s\n",s1);
printf("sssa2=%s\n",s2);
printf("sssa3=%s\n",s3);
printf("sssa4=%s\n",s4);
printf("sssa5=%s\n",s5);
printf("sssa6=%s\n",s6);
printf("sssa7=%s\n",s7);
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4];
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7);
printf("sssa1=%s\n",s1);
printf("sssa2=%s\n",s2);
printf("sssa3=%s\n",s3);
printf("sssa4=%s\n",s4);
printf("sssa5=%s\n",s5);
printf("sssa6=%s\n",s6);
printf("sssa7=%s\n",s7);
9、fprintf(fp,"%s %s",a,b); 读取两个字符串分别赋值给a,b
fprintf(fp,"%s,%s",a,b); 读取一个字符串然后按format赋值给a,但是b的值不定。