1. 程式人生 > >scanf函式之掃描集

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賦值的標誌

-> 將輸入的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函式對於字串的輸入,存在著許多的問題,所以需要我們注意這些細節性的問題。