引言: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丟棄。**
- 前言
- (四)回調函數
- (一)while(1)死循環與for(;;)死循環的區別
- (二)static關鍵字
- (三)函數
- (四)可變參數函數
- (五)setjmp和longjmp
- (六)指針
- (七)回調函數
- (八)字符串
- (九)動態內存分配
- (十)結構體
- (十一)深入理解指針
- (十二)命令行參數
- (十三)printf、fprintf、sprintf和snprintf函數
- (十四)const關鍵字詳解
- (十五)字符串輸入函數fgets、gets和scanf
- (十六)字符串輸出函數puts、fputs和printf
- (十七)字符/字符串輸出函數fputc、fputs、putc、putchar和puts
- (十八)字符/字符串輸入函數fgetc、fgets、getc、getchar和gets
- (十九)restrict關鍵詞
- (二十)scanf函數詳解
- (二一)內聯函數
- (二二)位操作
- (二三)errno變量
- (二四)內存分配