引言: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丟棄。
C語言天天練(二) statickeyword
引言 statickeyword不僅能夠修飾變數。並且能夠修飾函式。了解它的使用方法,不僅對閱讀別人的 有幫助,也有助於自己寫出更加健壯的程式。使用方法 用於不同的上下文環境時,statickeyword具有不同的意義。一 當它用於函式定義時,或用於 塊之外的變數宣告時,statickeyword用...
C語言天天練(十) 結構體
引言 資料經常以成組的形式存在。在c中,使用結構可以把不同型別的值存放在一起。結構的宣告有兩種 1 struct 然後用標籤 去宣告結構體變數。2 typedef struct 然後用 去宣告結構體變數。此時 是個型別名,而不像上面的 是個標籤。結構成員可以是標量 陣列 指標甚至是其他結構。結構成員...
C語言天天練(二四) 記憶體分配
引言 對於c語言程式,了解它執行時在記憶體中是怎樣分配的對於我們理解它的執行機制是很實用的。以下就總結一下c語言程式的一些記憶體分配知識。一 一段c程式。編譯連線後形成的可執行檔案一般有 段 資料段 堆和棧等幾部分組成。當中資料段又包含僅僅讀資料段 已初始化的讀寫資料段和未初始化的bss段。例如以下...