scanf函式到底怎麼讀取數字?

2021-10-05 14:56:04 字數 1585 閱讀 3987

scanf()函式返回值

scanf()讀取錯誤常見原因

對於c語言的初學者來說,printf()函式和scanf()函式是非常重要也是非常好用的兩個函式,作為標準輸出和輸入函式,他們為人機互動提供了通道。並且兩個函式做提供的,格式化輸入輸出方式為程式的可靠性提供了很大保障。

可靠通常意味著複雜,因此這兩個函式也為初學者帶來不小的學習困難。初學者編寫的程式出錯時,很多都是由輸入輸出函式使用不當造成的。輸出函式printf還好,出沒出錯從列印出的字元中一目了然,但是輸入的結果我們卻不能直接觀察,因此經常輸入函式使用錯誤後,系統結果呈現出來的錯誤報告我們可能都雲裡霧裡,不會直接說scanf函式出錯,那為什麼程式裡的scanf讀取的資料老是跟預想的不太一樣?

因為大多數的教學機構只會告訴你最基本的scanf函式用法,而且不會告訴你scanf函式的工作步驟。本文將詳細描述scanf函式讀取資料的步驟。

scanf函式和printf函式都使用格式字串和引數列表,兩者的格式字串類似,用於指示輸入的資料儲存型別,引數列表中為儲存變數的位址。格式字串用%字首修飾,後接轉換字元。之間可以新增修飾符。

下面是常用的幾個scanf的轉換說明

格式字串

型別說明

%c把輸入儲存為字元

%d、%i

把輸入儲存為有符號十進位制整數

%o把輸入儲存為有符號八進位制整數

%p把輸入儲存為位址

%s把輸入儲存為字串

%u把輸入儲存為無符號十進位制整數

%x把輸入儲存為有符號十六進製制整數

scanf()函式讀取的資料型別如上述有很多,但是主要的可以分為兩類,數字和字元。

讀取字元輸入時,scanf函式會讀取每個字元(包括空白字元),但一次只讀取乙個字元,儲存字元的方式通常為ascⅱ碼值。

讀取數字的步驟比較複雜。如果以十進位制整數形式讀取整數,scanf函式依然是每次讀取乙個字元,注意不是讀取一整個數字,但不會馬上結束讀取進行儲存。

首先scanf函式從第乙個輸入開始檢查,它會跳過所有空白字元,直到它發現乙個數字或者符號(+或-),它便會儲存該字元然後往下讀取,如果接下來讀取依然是數字,他就會不斷地儲存然後讀取下乙個字元直到遇見乙個非數字字元,scanf函式認為這裡是數字的結尾。

我們都知道scanf()和printf()函式都是從資料流中讀取資料,對於結尾的那個字元,scanf函式的做法是,把它放回輸入流,這也就意味著下一次讀取輸入時最先讀取的是上一次讀取被scanf()函式拋棄的那個字元,這也是常常導致我們的程式出錯的主要原因。

如果讀取到的第乙個非空白字元不是數字也不是正負號的話,scanf函式的做法是放棄這次讀取,並將字元放回輸入流,留給下乙個讀取函式。

scanf函式將會返還讀取成功的項數;如果沒有讀取或者讀取是失敗,它將會返回0;如果scanf函式檢測到檔案結尾,會返回eof,而在stdio.h標頭檔案中,它將eof定義為-1。

scanf

("%d,%d");

//這樣的輸入要求輸入的兩個整數之間必須要有「,」。

學習程式設計之路,多多練習是唯一捷徑,但遇到錯誤要及時查證才是快速成長的方法。

scanf函式的讀取

scanf 以刪除的方式從緩衝區讀取資料 輸入裝置的資料儲存緩衝區,比如鍵盤 也就是說,scanf從緩衝區讀入乙個資料項,該資料項在緩衝區中就被清除掉了。而如果scanf需要讀取乙個資料項,返現緩衝區當前是空的,那麼程式就會在scanf 處阻塞,等待使用者輸入,scanf函式接收到相應的資料項之後,...

fork函式到底做了什麼?

實體地址和邏輯位址 或稱虛擬位址 的概念。使用者程式看不見真正的實體地址。使用者只生成邏輯位址,且認為程序的位址空間為0到max。實體地址範圍從r 0到r max,r為基位址,位址對映 將程式位址空間中使用的邏輯位址變換成記憶體中的實體地址的過程。由記憶體管理單元 mmu 來完成。fork 會產生乙...

析構函式到底都做了什麼

析構函式釋放物件所使用的資源,並且銷毀物件的非static資料成員。析構函式是類的乙個成員函式,名字有波浪號接類名構成。沒有返回值,也不接受引數,同時由於析構函式不接受引數,因此它不能過載,所以任何乙個類都只具有乙個析構函式。析構函式具有乙個函式體和乙個析構部分。首先執行函式體,然後執行析構部分,來...