sscanf和sprintf使用[转]

来源:互联网 发布:淘宝刷单团队 编辑:程序博客网 时间:2024/05/04 09:03

 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 进制位数。