前言
%[]是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賦值的標志 -> 將輸入的def賦值個str2 -> 由於后面無需要賦值的變量,回車符作為結束輸入的標志
上述示例也引出了兩個問題:
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函數對於字符串的輸入,存在着許多的問題,所以需要我們注意這些細節性的問題。
最后,非常感謝Darkleafin、阿勝4K指出文章中的錯誤。