sscanf函數的用法 .

頭文件 #include

            定義函數 int sscanf (const char *str,const char * format,........);

            函數說明
            sscanf()會將參數str的字符串根據參數format字符串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換後的結果存於對應的參數內。


            返回值 成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。 返回0表示失敗    否則,表示正確格式化數據的個數    例如:sscanf(str,"%d%d%s", &i,&i2, &s);    如果三個變成都讀入成功會返回3。    如果只讀入了第一個整數到i則會返回1。證明無法從str讀入第二個整數。  

            範例 #include
            main()
            {
            int i;
            unsigned int j;
            char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”;
            char s[5];
            sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);
            printf(“%d %d %s ”,i,j,s);
            }

            執行 10 27 aaaaa


            sscanf(stringBuf.c_str(), "%20[^#]#%20[^ ]",......)語句中""中的內容含義爲:

            “%[
            ]”符號用於聲明字符串,它比“%s”更具體,可以用於設置讀取的樣式。例如“%[a-z]”只讀取小寫字母,讀到其它字符就結束。注意,方括號中如果有“^”,代表一直讀到某字符爲止。例如:


            “%[^#]”:讀取字符串,一直到出現“#”號爲止。

            “%20[^#]”:讀取20個字節的字符串,出現“#”號時結束。

            所以,“%20[^#]#%20[^ ]”的意義就是,

            讀取兩個20字節大小的字符串,第一個字符串可以用#結束,第二個字符串可以用回車符結束。

            它們的具體闡述,參見MSDN:“scanf Type Field Characters”章節,和“scanf Width
            Specification”章節。

*********************************************************************************************************************************************

大家都知道sscanf是一個很好用的函數,利用它可以從字符串中取出整數、浮點數和字符串等等。它的使用方法簡單,特別對於整數和浮點數來說。但新手可能並不知道處理字符串時的一些高級用法,這裏做個簡要說明吧。

  1. 常見用法。

以下是引用片段:
  charstr[512]={0};
  sscanf("123456","%s",str);
  printf("str=%s
",str);

  2. 取指定長度的字符串。如在下例中,取最大長度爲4字節的字符串。

以下是引用片段:
  sscanf("123456","%4s",str);
  printf("str=%s
",str);

  3. 取到指定字符爲止的字符串。如在下例中,取遇到空格爲止字符串。

以下是引用片段:
  sscanf("123456abcdedf","%[^]",str);
  printf("str=%s
",str);

  4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。

以下是引用片段:
  sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
  printf("str=%s
",str);

  5. 取到指定字符集爲止的字符串。如在下例中,取遇到大寫字母爲止的字符串。

以下是引用片段:
  sscanf("123456abcdedfBCDEF","%[^A-Z]",str);
  printf("str=%s",str);

*********************************************************************************************************************************************

名稱: sscanf() - 從一個字符串中讀進與指定格式相符的數據.

語法: int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

整數 sscanf( 字符串 str, 字符串 fmt, 混合 var1, 混合 var2 ... );

用法: 以指定的格式 fmt 去解讀字符串 str. fmt 中除了 %d 和 %s 以外, 亦可包含其他的字符串作爲格式. 每一個 %d 或 %s 都對應一個參數, 按順序爲 var1, var2 ... %d 讀入一個整數到參數中, 而 %s 讀入一個字符串. * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中) LPC 的 sscanf() 與 C 的 sscanf() 雖然相似, 但仍有不同之處. LPC 的 sscanf() 不需要 (也不可) 提供變量的內存位址給 sscanf(), 只需要給予變量的名字. 另一個不同點是, LPC 的 sscanf() 對於: sscanf( str, "%s %s", str1, str2 ); 的語法, 將會把 str 中的第一個英文單字 (即第一個空白字符以前的內容) 讀入 str1, 後面其餘的內容讀入 str2.

sscanf() 會返回符合格式的 %d 和 %s 總數.

以前曾經編寫過這樣的小程序:一個文本文件,每行是一條記錄,每條記錄中包含多個字段,每個字段之間以某種定界符分開,舉例如下:

Notebook,IBM,ThinkPad X32,6,12000

(各字段以逗號分隔,內容依次是:物品名稱,生產廠家,型號,數量,價格)

如果要對這樣的一行記錄進行處理,提取出各個字段,怎麼做比較好呢?

我以前的做法是在一個循環中用strtok函數每次取一個字段,然後將內容保存到一個字符串數組中。這樣做雖然可行,但我總感覺寫出的代碼有些囉嗦。

最近看到一段代碼,用C的標準庫函數sscanf,處理這樣的數據,只需一行就可以了。我把代碼整理了一下,去掉了無關的部分,核心部分如下:

float price;

int quantity;

char category[21], name[21];

char vendor[21], sku[21];

char buf[201];

fp = fopen(filename, "r");

fgets(buf, 200, fp);

sscanf(buf,

"%20[^#]#%20[^#]#%f#%i#%20[^#]#%20[^/n]",

name, sku, &price, &quantity, category, vendor);

下面簡單做些解說:

%20[^#]# 最多讀入20個字符,直到遇見定界符#,但不包含定界符

%f# 讀入一個浮點數,直到遇見定界符#

%i# 讀入一個整數,直到遇見定界符#

%20[^/n] 最多讀入20個字符,忽略行尾的回車符

是不是很簡潔明瞭呢?

#include <stdio.h>

int main()

{

char log[]="<14>2002-11-11 12:12:12 11.22.33.44 3 3 aaaa aaaaaa";

//char log[]="<1>2002-11-11 12:12:12 11.22.33.44 3 aaaa aaaaaa";

char test[]="<1111> 22";

char log2[200];

char str1[20];

char str2[20];

char str3[20];

char str4[20];

char str5[20];

char str6[20];

char str7[20];

int a1,a2,a3,a4,a5,a6;

sscanf(log,"<%d>%s %s %s %d %d %s",&a1,str2,str3,str4,&a5,&a6,str7);

printf("%d/n",a1);

printf("%s/n",str2);

printf("%s/n",str3);

printf("%s/n",str4);

printf("%d/n",a5);

printf("%d/n",a6);

printf("%s/n",str7);

sscanf(test,"<%d> %d",&a5,&a6);

printf("%d/n",a5);

printf("%d/n",a6);

sscanf(log,"<%[^>]>%[^ ] %[^ ] %[^ ] %[^ ] %[^ ] %[^$]",str1,str2,str3,str4,str5,str6,str7);

printf("%s/n",str1);

printf("%s/n",str2);

printf("%s/n",str3);

printf("%s/n",str4);

printf("%s/n",str5);

printf("%s/n",str6);

printf("%s/n",str7);

return 1;

}

const char *str = "drw-rw-rw- 1 user group 0 Oct 28 2003 -====流行音樂專用FTP=====-";

上面是源串,我要分別得到drw-rw-rw-,group,-====流行音樂專用FTP=====-字段

注意:因爲這幾個字段的值會變化,所以我要用格式化輸入,分別存入下面的a b c中,高手幫忙!

下面這個是我沒成功的嘗試

char a[20];

char b[50];

char c[20];

int ret = sscanf(str, "%[^'' '']* %[''u''] %[^'' '']"

, a, b, c);

masterz(www.fruitfruit.com) 於 2005-8-6 17:43:49

sscanf可以支持regular expression?或許你要用boost,下面有一個簡單的例子,雖然離你的問題還比較遠

http://www.fruitfruit.com/vc/boost/boost_regex_test.cpp

newbiestar 於 2005-8-6 18:29:18

樓主一個問題好幾個地方問……

int ret = sscanf(str, "%s%*s%*s%s%*s%*s%*s%*s%s", a, b, c);

這樣就可以了,不要的東西都拋棄掉了

參見這個帖子裏面我的回覆

http://community.csdn.net/Expert/topic/4192/4192979.xml?temp=.2922632

ding8125(丁丁) 於 2005-8-6 19:19:12

可以通過字符數組輸出一個字符串!~

今天看到一個奇怪的scanf。其實這只是用了正則表達式。

sscanf(user, "%127[^:]:%127[^ ]", user_name, password);

"%127[^:]:%127[^ ]",是正則表達式

用scanf或者printf,可以在%後面跟%d,%s等東西,也可以跟一個正則表達式。

這裏,127表示最多可以接受127個字符,[^:]是正則表達式,表示非":",到":"結束

後面,%127[^ ],同樣,其中[^ ]是正則表達式,表示非" ",到" "結束

所以,如果user是"wpc:123456"的字符串,那麼經過上面的sscanf後,

user_name是wpc,而password是123456

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