在一些場合中,會針對較特別格式之資料做處理,最後往往都是在字串那裡轉來轉去。

比較穩固的做法,大概是用 fgets 一行一行抓下來後,對該字串做分析,

然而更強大的應是用 Regular expression,這裡並不針對 Regular expression 做過多解釋與說明,

library 的話可參考下面幾套 library

HS REGEX routines

GNU Regex

VC 裡要用 Regex 有幾個選擇可參考,一是安裝 Feture Pack (英文版 VC) 或 SP1(中文版 VC),Regex library 含在 TR1 裡面,當然也可只裝 TR1 library 即可;另一方法,用 boost 吧。

如果都不想這麼麻煩額外裝函式庫 (想想,當初我為了裝 Feture Pack,花了大半天的時間,結果是要裝 SP1,這二個幾乎是一樣的,只差在語言和一些 bug.. ), scanf 就學好點吧。

以下提幾個 scanf 較少見的技巧,確實不難,下面直接舉例說明。

0. 指定長度 %5s

配對時,最多只收長度為 5 之字串

 char s[2000],g[200];
 scanf("%5s%s", s, g);
 printf("s=%s, g=%s\n", s, g);

1234567890
s=12345, g=67890

 

1.  指定字元配對 %[abz;]

配對時,只收 abz; 這四個字元

char s[2000],g[200];
scanf("%[abz;]%s", s, g);
printf("s=%s, g=%s\n", s, g);

az;abb;ABcdef123
s=az;abb;, g=ABcdef123

 

2. 指定字元配對 %[a-z ]

注意到,a-z 後面還有一個空白。配對時,只收 a-z 及空白鍵

 char s[2000],g[200];
 scanf("%[a-z ]%s", s, g);
 printf("s=%s, g=%s\n", s, g);

abc xyz 123
s=abc xyz , g=123 

 

3. 指定字元配對 %[a-zA-Z0-9]

配對 a~z, A~Z, 0~9

 char s[2000],g[200];
 scanf("%[a-zA-Z0-9]%s", s, g);
 printf("s=%s, g=%s\n", s, g);

adzBWR0a8;das
s=adzBWR0a8, g=;das

 

4. 指定斷點字元 %[^,]

^ 即為斷點的意思,%[^,] 即為讀到 , 之前 (不含 ,) 之字串

 char s[2000],g[200];
 scanf("%[^,]%s", s, g);
 printf("s=%s, g=%s\n", s, g);

ab,cd
s=ab, g=,cd

相似的,也有 %[^a-z]

 

5. 符號中間之文字 %[^@]@%[^.]

取得 @~. 之間之文字,不含 @ 與 .

 char s[2000],g[200];
 scanf("%*[^@]@%[^.]%s", s, g);
 printf("s=%s, g=%s\n", s, g);

edisonx@pixnet.net.tw
s=pixnet, g=.net.tw

 

基本上,用上面的 [] 與 [^] 可做的事非常多,多練習應可達到不錯效果。

edisonx 發表在 痞客邦 PIXNET 留言(4) 人氣()


留言列表 (4)

發表留言
  • momo
  • 寫的真的很好

    謝謝XD
  • xyz軟體帝國
  • excz麻將派對 Mahjongg Party PAL WII(歐版)excz
  • Chris
  • 感謝你這篇的說明!!
    簡單又清楚,謝謝!
  • 訪客
  • THX

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼