通过学习和使用个人认为,在字符串格式不是很复杂,但是也并不简单的时候用这个函数比较合适,这个尺度就要靠自己把握了,字符串不是很复杂,但自己写个处理的函数比较麻烦,效率也不高,就用这个函数,如果字符串很复杂,那就用正则表达式吧。
不多说了,看看下面这些介绍和列子吧!
函数原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
1. 常见用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
sscanf(" iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
printf("%s\n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
8、
char *s="1try234delete5"
则:
sscanf(s, "1%[^2]234%[^5]", s1, s2);
scanf的format中出现的非转换字符(%之前或转换字符之后的字符),即此例中的1234用来跳过输入中的相应字符;
‘[]’的含义与正则表达式中相同,表示匹配其中出现的字符序列;^表示相反。使用[ ]时接收输入的变量必须是有足够存储空间的char、signed char、unsigned char数组。记住[也是转换字符,所以没有s了。
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",s1);
printf("sssa2=%s",s2);
printf("sssa3=%s",s3);
printf("sssa4=%s",s4);
printf("sssa5=%s",s5);
printf("sssa6=%s",s6);
printf("sssa7=%s",s7);
9、一个提取用户个人资料中邮件地址的例子
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
char a[20]={0};
char b[20]={0};
//假设email地址信息以';'结束
sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a);
//假设email地址信息没有特定的结束标志
sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b);
printf("%s\n",a);
printf("%s\n",b);
system("pause");
return 0;
}
关键是"%*[^:]:%[^;]"和"%*[^:]:%s"这两个参数的问题
%*[^:] 表示满足"[]"里的条件将被过滤掉,不会向目标参数中写入值。这里的意思是在
第一个':'之前的字符会在写入时过滤掉,'^'是表示否定的意思,整个参数翻译
成白话就是:将在遇到第一个':'之前的(不为':'的)字符全部过滤掉。
: 自然就是跳过':'的意思。
%[^;] 拷贝字符直到遇到';'。
%[ ] 的用法:%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。
%[^a-z] 读取不在 a-z 之间的字符串,如果碰到a-z之间的字符则停止,如
%*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串。
%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:
以前只是简单是使用sscanf,却没发现其还有如此强大的功能
char str0[100],str1[100],str2[100],str3[100];
sscanf("abcde abc 123 aaa","%s %s %s %s",str0,str1,str2,str3);
结果:str0="abcde" str1="abc" str2 = "123" str3="aaa"
sscanf("abcde abc 123 aaa","abc%s %s %*d %s",str0,str1,str3);
结果:str0="abcde" str1="abc" str3="aaa"
sscanf("abc123 efg456","%4s",str0);
结果:str0="abc1"
sscanf("abc123 efg456a4","%[a-z 1-5]",str0);
结果:str0="abc123 efg45"
sscanf("abc123 efg456a4","%[a-z1-5]",str0);
结果:str0="abc123"
sscanf("ABCTabcZ123 efg456","%[A-P]",str0);
结果:str0="ABC"
sscanf("abc 12345","%[^ ]",str0);
结果:str0="abc"
sscanf("abc 12345","%[^4]",str0);
结果:str0="abc 123"
sscanf("fdaBs 52aB1asdf","%[^4-0]",str0);
结果:str0="fdaBs 5"
sscanf("abc 12345","%[^ ]%[^3]",str0,str1);
结果:str0="abc" str1="12"
sscanf("abc301abc2345","%*[^9-0]%s",str0);
结果:str0="301abc2345"
sscanf("bca@123efg4@5abc","%*[^@]@%[^@]",str0);
结果:str0="123efg4"