在一些場合中,會針對較特別格式之資料做處理,最後往往都是在字串那裡轉來轉去。
比較穩固的做法,大概是用 fgets 一行一行抓下來後,對該字串做分析,
然而更強大的應是用 Regular expression,這裡並不針對 Regular expression 做過多解釋與說明,
library 的話可參考下面幾套 library
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
基本上,用上面的 [] 與 [^] 可做的事非常多,多練習應可達到不錯效果。