scanf函式之掃描集
前言
%[]是scanf函式不常用到的格式字元——掃描集(scanset),它的用法很簡單,但卻能巧妙地解決一些輸入問題。(由於書籍裡和網上對此格式字元的介紹很少且篇幅較小,本文可能會有些許錯誤,請讀者勘誤)
引入
介紹掃描集用法前,先明確下面三點:
1.掃描集用於賦值給字元型變數,包括字串、字元陣列。(不建議使用單個字元變數)
2.scanf函式以空白字元(空格符、製表符、回車符)結束對變數的賦值。
3.所有變數都已賦值的情況下,回車是對scanf函式的結束,即繼續執行下面的命令。
以下給出示例來解釋2、3點。
1 char str1[5] , str2[5]; 2 3 puts("輸入:"); 4 scanf("%s%s",str1,str2); 5 6 puts("輸出:"); 7 printf("str1 = %s\nstr2 = %s",str1,str2);
螢幕結果如下:
/* 使用空格符結束對變數的賦值 */ 輸入: abc def 輸出: str1 = abc str2 = def /* 使用回車符結束對變數的賦值 */ 輸入: abc def 輸出: str1 = abc str2 = def
由上述示例可知,scanf函式的流程(只描述第二個輸入)是:將輸入的abc賦值給str1 -> 由於後面存在賦值的變數,輸入的回車符作為結束對變數str1賦值的標誌
上述示例也引出了兩個問題:
1.若想將空白字元賦值給變數怎麼辦?
2.能否使用其他字元作為結束對變數的賦值?
同時,也引出第三個問題:
3.怎麼只讀取特定字元呢?
用法
此時,掃描集就能解決上述三個問題,以下是它的兩個格式,其中string為任意字元:
%[string] // 只讀取包含在[]中的字元 %[^string] // 讀取除[]中字元以外的字元,^為取反的意思
下面給出示例及螢幕結果,示例中省略變數宣告:
1 /* 第一個格式示例 */ 2 puts("輸入:"); 3 scanf("%[abc]",str); // 除abc三個字元外,其他字元均會結束對變數的賦值 4 5 puts("輸出:"); 6 printf("str = %s",str);
輸入:
abcdef
輸出:
str = abc
可以看到,scanf函式只讀取了abc,這裡d作為結束對變數str賦值的標誌,後面的輸入被忽略。
1 /* 第二個格式示例 */ 2 puts("輸入:"); 3 scanf("%[^abc]",str); // abc三個字元均會結束對變數的賦值,其他任意字元都會被賦值給變數 4 5 puts("輸出:"); 6 printf("str = %s",str);
輸入:
defabc
輸出:
str = def
上述示例,scanf函式將a作為結束對變數str賦值的標誌,同樣忽略後面的輸入。
若是想代表所有字母或數字,不必要輸入所有的字母和數字,只需使用破折號來代表一定的範圍即可,例如:
a-z 代表從a到z的26個小寫字母
A-Z 代表從A到Z的26個大寫字母
c-z 代表從c到z的24個小寫字母
0-9 代表從0到9的10個數字
綜合上述的用法,就可解決那三個問題,在這就不給出示例。
後話
scanf函式對於字串的輸入,存在著許多的問題,所以需要我們注意這些細節性的問題。