c標準庫提供的格式化輸出函數:
int scanf(const char *format, ...);
其它family 函數:
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
scanf最令人興奮的地方就在於 format。這裡使用實際代碼總結下比較少用的2個格式化功能: %[ ] 和 %n
1.從標準輸入中讀取帶有空格的字串
當然 我們可以使用char *fgets(char *s, int size, FILE *stream);
但是scanf同樣可以完成,我們知道scanf的預設以空白符(空格、定位字元、斷行符號)分割字元,所以當你輸入"hello world"之類的字串時,得到的只是 hello而已。
你可以使用 %[ ] 來完成, %[ ]可以讓我們自訂一個搜尋字元集,^ 表示取反的意思 %[^\n]表示不是'\n'都讀入,遇到'\n'就停止,也可以在%之後加入數字表示最多讀入多少個字元,這樣可以控制數組溢出。
#include <stdio.h>#define MAX_SIZE 128intmain(void){ char buf[MAX_SIZE+1]; scanf("%MAX_SIZE[^\n]",buf); printf("%s\n",buf); return 0;}
2.使用自訂的字元分割
scanf的預設以空白符(空格、定位字元、斷行符號)分割字元,那麼可不可以自己定義分割的字元呢? 可以,同樣使用%[ ]
比如,這樣一個字串"email:christian_chen@126.com" ,我要從這個字串中提取出user:christian_chen 出來
一起來看代碼
#include <stdio.h>#define MAX_SIZE 128intmain(void){ char email_addr[] = "email:christian_chen@126.com"; char user[MAX_SIZE]; sscanf(email_addr,"%*[^:]:%[^@]",user); printf("%s\n",user);}
%*[^:]表示讀取不是':'的字元,*表示唯讀取不儲存,也就是忽略了字串‘:’之前的內容,:%[^@]匹配了一個':'忽略 ,然後讀取了不是'@'的字元,也就讀取了我們需要的christian_chen
其實stdin.h 提供的scanf非常實用,這裡總結一些小技巧
之後總結.....