sscanf与sprintf
一 sscanf函数
int sscanf(const char *s,const char *format,..);
int scanf(const char *format,...);
sscanf与scanf等价,所不同的是,前者的输入字符来源于字符串s,而scanf以stdin作为输入源。
1 %*d,%*s:*号表示此数据不读入,忽略掉。
比如
ch="MemTotal: 2028248 kB"
sscanf(ch,"%*s%d",&total);
printf("%d\n",total);
输出结果:2028248
2 取指定长度的字符串
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
3 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4 sscanf(ch,"%*[^e]%[^2]",ch1);
寻找e到2之间的数,包括e但不包括2
如果中间有空格,包括空格。
5 给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
6 分割字符串
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
如果2006:03:18 - 2006:04:18间没有空格
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
二 sprintf
- 负号时表示从后向前处理
0 表示空格填0
字符总宽度 小数点前面的数
精确度 小数点后面的数
1 把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
2 sprintf(s, "%08X", 4567); //产生:"000011D7"
3 char a1[] = {''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G''};
char a2[] = {''H'', ''I'', ''J'', ''K'', ''L'', ''M'', ''N''};
sprintf(s, "%.7s%.7s", a1, a2);//产生:"ABCDEFGHIJKLMN"
这可以类比打印浮点数的”%m.nf”,在”%m.ns”中,m 表示占用宽度(字符串长度不足时补空格,超出了则按照实际宽度打印),n 才表示从相应的字符串中最多取用的字符数。通常在打印字符串时m 没什么大用,还是点号后面的n 用的多。自然,也可以前后都只取部分字符:
sprintf(s, "%.6s%.5s", a1, a2);//产生:"ABCDEFHIJKL"
sprintf(s, "%.*s%.*s", 7, a1, 7, a2);
或者:
sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);
4 实际上,前面介绍的打印字符、整数、浮点数等都可以动态指定那些常量值,比如:
sprintf(s, "%-*d", 4, ''A''); //产生"65 "
sprintf(s, "%#0*X", 8, 128); //产生"0X000080","#"产生0X
sprintf(s, "%*.*f", 10, 2, 3.1415926); //产生" 3.14"
5 sprintf(s, "%p", &i);
6 strlen 便已经知道了结果字符串的长度。如:
int len = sprintf(s, "%d", i);
对于正整数来说,len 便等于整数i 的10 进制位数。