初看scanf時,覺得還是蠻簡單的,但當深入學習後,才發現裡面有很多小細節值得我們去注意。
首先,看看scanf的基本格式:scanf("《格式化字串》",《位址表》)
scanf()函式返回成功賦值的資料項數,出錯時則返回eof。
我們輸入的資料大體上可以分為幾個型別::
格式化說明符
空白符*****(空白符包括 空格,製表符,換行符,回車符和換頁符)*****
非空白符
下面是幾個容易忘記的點:
1.sacnf()中的變數必須使用位址。
這是相當基礎的點,但當很多新手敲**的時候總是容易忘記。
2.scanf()的格式控制串可以使用其它非空白字元,但在輸入時必須輸入這些字元。
就像scanf("%d,%d",&a,&b)
一樣,當你輸入資料的時候,如輸入10和12時,要這樣10,12
.
記得將非空白字元也要弄過去!!!輸入進去!!!
ex:scanf(「a=%d,b=%d」,&a,&b);
輸入: a=3,b=4 ↙(「a=」,「b=」,逗號與"%d,%d"中的"a=","b="及逗號對應)
3.scanf()函式接收輸入資料時,遇以下情況結束乙個資料的輸入:(不是結束該scanf函式,scanf函式僅在每乙個資料域均有資料,並按回車後結束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。
下面介紹乙個有用的函式
函式名: fflush
功 能: 清除乙個流
一般這樣寫: fflush(stdin);
拿來清空緩衝區!!
也可以用「空格符」來處理緩衝區殘餘資訊的示例:
!!!!
scanf(" %c",&a);
注意啊,%c前面是有乙個空格的,這是來把前面留下的空格吸走的!(嘻嘻)
處理scanf()函式誤輸入造成程式死鎖或出錯
#include int main()
如上程式,如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的型別,你的程式不是死鎖,就是得到乙個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?
解決方法:scanf()函式執行成功時的返回值是成功讀取的變數數,也就是說,你這個scanf()函式有幾個變數,如果scanf()函式全部正常讀取,它就返回幾。但這裡還要注意另乙個問題,如果輸入了非法資料,鍵盤緩衝區就可能還個有殘餘資訊問題。
正確的例程:
#include int main()
難點問題
1.對於scanf中的空白符問題
例子:scanf( "%d/n ",&a);//這裡多了乙個回車符/n
結果要輸入兩個數程式才結束,而不是預期的乙個。
原因:::
用空白符結尾時,scanf會跳過空白符去讀下乙個字元,所以你必須再輸入乙個數。這裡的空白符包括
空格,製表符,換行符,回車符和換頁符。所以如果你用scanf( "%d ",&a)也會出現同樣的問題。
注意哈,%d後面是有空格的
反思::
!!!!
敲**的時候呢,要注意哈,scanf中的不要亂加 空格啊。。。
不然很難解決的1!!!
2.scanf()函式的引數輸入型別不匹配問題
對於scanf( "%d%c ",&a,&c),scanf語句執行時,首先試圖從緩衝區中讀入乙個%d型別的資料,如果和 第乙個引數匹配,則繼續從緩衝區中讀取資料和第二個引數進行匹配,依次進行下去,直到匹配完所有的參 數;如果其中有乙個引數不匹配,那就從這個地方跳出,忽略這個scanf後面所有的引數,而去執行下一條語句。
還要注意另乙個問題,如果輸入了非法資料,鍵盤緩 沖區就可能還個有殘餘資訊問題。
總結以上第二點(個人認為的最難點):
如果和 第乙個引數匹配,則繼續從緩衝區中讀取資料和第二個引數進行匹配,依次進行下去,直到匹配完所有的參 數;如果其中有乙個引數不匹配,那就從這個地方跳出,忽略這個scanf後面所有的引數,而去執行下一條語句。
重要事情說三遍:哈哈哈:
如果和 第乙個引數匹配,則繼續從緩衝區中讀取資料和第二個引數進行匹配,依次進行下去,直到匹配完所有的參 數;如果其中有乙個引數不匹配,那就從這個地方跳出,忽略這個scanf後面所有的引數,而去執行下一條語句。
是執行下乙個語句啞!
scanf 函式用法
雖然有人說在大型程式設計中永遠不要使用scanf 但是對於習慣用c的人和參加 acm icpc的人,scanf 還是用的比較多的,而且用好了用起來也很方便。下面整理一點兒平時常需要用到而可能有些人一直理不清的一些知識 一般常識 scanf 函式的一般格式為 scanf 格式字串 輸入項首位址表 sc...
scanf函式的用法
scanf 通過鍵盤將資料輸入到變數中 兩種用法 用法一 scanf 輸入控制符 輸入引數 功能 將鍵盤輸入的字元轉化為輸入控制符所規定格式的資料,然後存入以輸入引數的值為地質的變數 用法二 scanf 非法輸入控制符 輸入控制符 輸入引數 功能 將從鍵盤輸入的字元轉化為輸入控制符所規定格式的資料,...
C語言scanf 與printf 函式用法
c 單個字元 d 十進位制整數 int ld 十進位制整數 long f 十進位制浮點數 float lf 十進位制浮點數 double o 八進位制數 s 字串 char u 無符號十進位制數 dword x 十六進製制數 0x00000 printf 4d 1 1 輸出1的前邊有3個空格,補齊4...