scanf()以刪除的方式從緩衝區讀取資料(輸入裝置的資料儲存緩衝區,比如鍵盤);也就是說,scanf從緩衝區讀入乙個資料項,該資料項在緩衝區中就被清除掉了。而如果scanf需要讀取乙個資料項,返現緩衝區當前是空的,那麼程式就會在scanf**處阻塞,等待使用者輸入,scanf函式接收到相應的資料項之後,在緩衝區中將這一資料項清除,scanf函式返回,程式繼續執行。
格式化字串(format string)
規定了 scanf 等函式如何從輸入緩衝 stdin 中讀取資料,其組成字元的含義如下所示:
(1)空白字元(whitespace)。scanf 會讀取並忽略在 stdin 中下乙個非空白字元之前的所有空白字元(空格、換行和 tab),然後讀取格式化字串中規定格式的資料。若格式化字串中包含空白字元,則該空白字元會與輸入緩衝區中任意數量的連續空白字元相匹配,並將其從緩衝區中清除(包括0個)。例如格式化字串"%d %d",會要求 scanf 首先從緩衝區中讀取乙個整型(若之前存在空白字元則跳過),再跳過輸入緩衝區中連續的空白字元(與格式化字串中的空白字元匹配),最後再讀取乙個整形;
(2)非空白字元(non whitespace)。對於格式化字串中既非空白字元又不是格式說明符(format specifier,由%標識)的一部分的字元,scanf 會嘗試從 stdin 中讀取輸入,並將輸入與該字元比較,若匹配,則繼續進行後續讀取,若不匹配,則函式返回錯誤資訊;
(3)格式說明符。以 % 開頭的用於指定輸入資料格式的字元。如 %d 指定需要讀取乙個整形,%s 需要讀取乙個字串。scanf 等函式首先根據格式說明符嘗試去解析 stdin 中的資料,如對於 %d ,scanf 會嘗試對 stdin 中已有資料以整型的格式進行解析。若解析成功,則將上述解析結果存放到指定的記憶體中,若解析失敗,如 stdin 中僅存在乙個字元 『a』,scanf 會退出並返回,但是上述不匹配的資料並不會從緩衝區中清除,後續的 scanf 呼叫仍從上述輸入開始讀取
除了%c 其他轉化說明都會自動跳過待輸入值前面所有的空格
scanf通常返回的是成功賦值(從標準輸入裝置賦值到引數列表所指定的記憶體區域)的資料項數,如果出錯或是遇到end of file(注意,如果想從鍵盤輸入eof,在windows的dos視窗用ctrl+z 或f6;在unix系統上,用ctrl+d。),則返回eof
將ab送到緩衝區,scanf函式讀取緩衝區內容,發現與格式不匹配,不會把值賦給nnum,他並不會丟棄該內容,而是將其放回緩衝區,下一次緩衝區讀取仍從這裡開始,所以下面cha的值為a
我們可以看到當第乙個引數讀取失敗的時候,後面的所有都不會被讀取,
當再次嘗試為cha賦值的時候 緩衝區還是從指向a,從他開始讀取。
而且返回值是0,表示讀取成功了0個引數。
我們可以看到引數的返回值是1,表示讀取成功了乙個引數,就是cha = 『a』;
然後scanf嘗試為引數nnum讀取時,發現不匹配,將字元b放回緩衝區,並結束該次的scanf,當再次從緩衝區為cha讀取資料時,讀取的便是字元b了
cha讀取的便是空格 第二次才讀取到a,%c不會忽略空白字元,別的都會忽略,可以自己去嘗試
scanf 函式讀取型別不匹配問題
一般情況下scanf d num 會讀取乙個字元,如果該字元是數字,它便儲存該數字並讀取下乙個字元,知道遇到第乙個空白字元為止。或者遇到非數字字元,它也會停止讀入,然後scanf 函式把非數字字元放回輸入。這意味著在改程式下一次讀入時,首先讀取到的是上一次丟棄的非數字字元。在linux系統下,如果s...
scanf函式到底怎麼讀取數字?
scanf 函式返回值 scanf 讀取錯誤常見原因 對於c語言的初學者來說,printf 函式和scanf 函式是非常重要也是非常好用的兩個函式,作為標準輸出和輸入函式,他們為人機互動提供了通道。並且兩個函式做提供的,格式化輸入輸出方式為程式的可靠性提供了很大保障。可靠通常意味著複雜,因此這兩個函...
c中scanf函式讀取換行符的問題
c中利用scanf 函式輸入字串,在按下回車後 n 字元是被儲存在了快取區的,如果下一次繼續讀入字元這個換行符可能會產生影響,也可能不會產生影響。總結如下 不會產生影響的情況 第二次輸入為 字串 或數字 scanf s a scanf s b printf s n a printf s n b 如果...