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

发布了328 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Rhao999/article/details/105116128