引言:scanf函數雖然是學習C語言時比較早就接觸的一個函數,但在使用過程中,發現真正掌握它卻并不容易。本文就通過各種例子來詳細的總結一下該函數的各種用法,假設它的調用格式為 scanf("<格式化字符串>",<地址表>)。
1、一般使用scanf函數時都是為某個變量賦值,不考慮它的返回值。但是任何函數都是需要返回的(即使返回類型用void,也可以認為只是調用了return語句,只是并沒有返回什么東西而已),同樣的scanf函數也是有返回的,它的返回值是成功讀取變量的個數。如果有一個輸入與變量格式不匹配,那么返回值為0。如:
~~~
scanf("%d?%d",?&num1,?&num2);???
~~~
如果輸入兩個中間有空格隔開的數字(如2 3),那么它的返回值是2。如果輸入一個浮點數一個整數,則返回值是1。如果輸入一個字符一個整數,則返回值是0。
2、scanf函數的<格式化字符串>與后面的<地址表>是必須嚴格匹配的。注意,是嚴格匹配,可以說不能有絲毫差別,但對于連續多個空格可以等同于一個空格。如:
~~~
scanf("%d,?%d",?&num1,?&num2);??
~~~
要想輸入正確,必須輸如一個整數,然后輸入一個逗號(,),之后是第二個整數。最后是回車結束。
~~~
scanf("%d,%d",?&num1,?&num2);??
~~~
該條語句中的<格式字符串>中的兩個%d之間沒有空格,如果此時輸入:12 ,13回車(12后面先有一個空格后由逗號),那么num2并不等于13。反過來,輸入:“12”、“,”、“空格”、“13”,則不會出現錯誤。
3、scanf函數用%s讀取一個字符串時,其實它只能讀取一個單詞,因為遇到空格時,它會認為輸入已結束。因此一般使用fgets來讀取一個字符串。如果想用scanf函數讀取帶有空格的字符串時,需要使用參數%[ ]來完成,它的意思是讀入一個字符集合。[ ]是個集合的標志,%[ ]特指讀入此集合所限定的那些字符,比如%[A-Z]是輸入大寫字母,一旦遇到不在此集合的字符便停止。如果集合的第一個字符是“^”,這說明讀取不在"^"后面集合的字符,既遇到"^"后面集合的字符便停止(這就是scanf函數里的正則表達式應用)。注意:此時讀取的字符串是可以含有空格的。如:
~~~
scanf("1123%s",&str);??
~~~
輸入:1123aaabb 時str為 aaabb,但是,輸入 24aabbdd時,?? 會出錯,因為1123必須進行嚴格匹配。
~~~
scanf("%[^\n]",?&str);??
~~~
此時輸入fdjkf fkdjf jdkf,然后輸入回車,就給str賦值為fdjkf fkdjf jdkf。
scanf("%[A-Z]",&str);輸入除A到Z的任何字符(包括空格、回車)都會停止。
4、對于下面兩條語句
~~~
scanf("%d?",?&num);/*scanf("%d\n",?&num);*/??
printf("%d",num);??
~~~
我們輸入一個整數后,無論在輸入多少個空格、回車、Tab,都沒有輸出;但是當再次輸入非空白字符時,如輸入2 然后輸入空格然后輸入4,最后輸入回車,則會有輸出。
5、對于scanf函數的%c格式轉換符,可以接受任何的非空白字符或空白字符(包括空格、回車、Tab甚至是F2這樣的字符)。
~~~
char?str;??
scanf("%c",?&str);??
printf("str?=?%c\n",?str);??
~~~
如果輸入:空格……/*……代表任意空白字符或非空白字符*/,則str被賦值為空格。
如果輸入:回車,則str被立即賦值為換行字符‘\n’。
如果輸入:fjdkfj,則str被賦值為f,f后面的jdkfj丟棄。