c語言scanf 函式的原理

2021-10-04 02:00:43 字數 939 閱讀 7560

想象輸入裝置(鍵盤)連線著乙個叫「緩衝」的東西,把緩衝認為是乙個字元陣列。

當你的程式執行到scanf時,會從你的緩衝區讀東西,如果緩衝區是空的,就阻塞住,等待你從鍵盤輸入。

現在假設你的緩衝區裡有:abcd\n1234\n (其中\n是回車符)執行:scanf("%s",name);的時候,由於scanf是讀資料直到看見空白符(空白符:指空格符、製表符、回車符)就停止的輸入函式。所以執行後,把abcd存到了name中。緩衝區於是變成了 : \n1234\n

接下來的執行就有問題了,如果遇到了:scanf("%d",&number);怎麼辦?因為遇到了回車符,它並不是乙個數字,所以scanf還有乙個特性,就是忽略先導的空白符。不管是有幾百個回車也好,幾萬個空格也罷,只要它們連續地出現在緩衝區的開頭,就統統忽略他們。然後再讀有意義的字元。於是1234被讀入number。

回到剛剛,當緩衝區還是:\n1234\n的時候,如果遇到了:scanf("%c",&***);應該怎麼辦呢?你說,那好辦呀,不是說了忽略前導空白符嗎?跳過回車讀』1』呀!想法是好的,可這只針對你的程式這一種情況。如果我編寫的程式就是統計使用者輸入了多少個回車呢?所以對scanf來講跳過前導空白符有個例外,當引數是%c的時候,就把緩衝區的第乙個字元返回回去,不管是什麼

。這樣的設計就有個問題,scanf對不同的引數表現出來的特性不一樣。得承認,這是個缺陷,但不是說這樣不好。

這樣的設計至少把發現所有字元的機會交給了使用者,設計者這樣想:如果程式設計師使用了scanf("%c",…),那他就有必要知道這函式能把回車符讀出來,至於程式設計師對回車符感不感興趣,那就看他了,不感興趣的話,程式設計師也一定知道該怎麼處理。回到你的程式裡。

當執行scanf("%s",name)的時候,要求你從鍵盤輸入,於是你輸入了"abc",然後「回車」。緩衝區裡自然而然地是:abc\n scanf把abc拿走了,留下了\n,緩衝區裡現在就剩下\n於是,下乙個scanf ("%c",&***); 想當然地讀取了\n

C語言 scanf 函式

scanf 函式是用來從外部輸入裝置向計算機主機輸入資料的。scanf 函式的一般格式 案例 已知圓柱體的底半徑radius 1.5,高high 2.0,求其體積。main 案例 已知圓柱體的底半徑為radius,高為high,求其體積。功能 說明函式scanf 的格式及作用。main 程式執行結果...

C語言scanf函式

四 注意事項 編寫程式的主要目的就是為了處理資料。資料從 來?資料的 有很多種方式,如從磁碟檔案中讀取資料 從資料庫中讀取資料 從網頁中抓取資料等,還有一種原始的方式就是從鍵盤輸入資料。在c語言中,有三個函式可以從鍵盤獲得使用者輸入。getchar 輸入單個字元,儲存到字元變數中。gets 輸入一行...

C語言 scanf函式

1 scanf函式,是乙個標準的輸入函式 是乙個阻塞式的函式 當使用scanf的時候,程式會等待使用者輸入,如果不輸入內容,程式不再往下執行 作用 接收從鍵盤輸的的內容 2 使用格式 對比printf printf 格式控制字串 變數列表 scanf 格式控制字串 變數的 位址 列表 printf ...