一 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 進位位元。