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 進制位數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章