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

        最后,非常感謝Darkleafin、阿勝4K指出文章中的錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM