雖然用gets()時有空格也可以直接輸入,但是 gets() 有乙個非常大的缺陷,即它不檢查預留儲存區是否能夠容納實際輸入的資料,換句話說,如果輸入的字元數目大於陣列的長度,gets 無法檢測到這個問題,就會發生記憶體越界,所以程式設計時建議使用fgets()。
fgets() 的原型為:
1 #include
2 char*fgets(char*c ,int size, file*stream) ;
fgets() 雖然比 gets() 安全,但安全是要付出代價的,代價就是它的使用比 gets() 要麻煩一點,有三個引數。它的功能是從 stream 流中讀取 size 個字元儲存到字元指標變數 s 所指向的記憶體空間。它的返回值是乙個指標,指向字串中第乙個字元的位址。
其中:
我們發現輸入的是「i love you」,而輸出只有「i love」。原因是 fgets() 只指定了讀取 7 個字元放到字元陣列 str 中。「i love」加上中間的空格和最後的 『\0』 正好是 7 個字元。
那有人會問:「用 fgets() 是不是每次都要去數有多少個字元呢?這樣不是很麻煩嗎?」不用數! fget() 函式中的 size 如果小於字串的長度,那麼字串將會被擷取;如果 size 大於字串的長度則多餘的部分系統會自動用 『\0』 填充。所以假如你定義的字元陣列長度為 n,那麼 fgets() 中的 size 就指定為 n–1,留乙個給 『\0』 就行了。
!!但是需要注意的是,如果輸入的字串長度沒有超過 n–1,那麼系統會將最後輸入的換行符 『\n』 儲存進來,儲存的位置是緊跟輸入的字元,然後剩餘的空間都用 『\0』 填充。所以此時輸出該字串時 printf 中就不需要加換行符 『\n』 了,因為字串中已經有了。
下面寫乙個程式看一下:
我們看到,printf 中沒有新增換行符 『\n』,輸出時也自動換行了。
所以 fgets() 和 gets() 一樣,最後的回車都會從緩衝區中取出來。只不過 gets() 是取出來丟掉,而 fgets() 是取出來自己留著。但總之緩衝區中是沒有回車了!所以與 gets() 一樣,在使用 fgets() 的時候,如果後面要從鍵盤給字元變數賦值,那麼同樣不需要清空緩衝區。下面寫乙個程式驗證一下。
參考部落格:
fgets函式的使用
以字串為單位的i o函式 2009年12月20日 星期日 14 59 fgets從指定的檔案中讀一行字元到呼叫者提供的緩衝區中,gets從標準輸入讀一行字元到呼叫者提供的緩衝區中。include char fgets char s,int size,file stream char gets cha...
fgets 函式的使用分析
1 fgets函式的特點 讀取n 1 n為陣列個數,第n個位置會自動新增 0 個字元,以 n 為結束標記,並在讀取到 n 之後,在末尾處新增 0 構成字串 當讀了n 1個字元後,仍未讀到 n 也會自動新增 0 結束讀取。2 fgets的返回值 成功 返回指向該串的指標,失敗或讀到檔案結尾返回空指標,...
fread 和fgets 函式的使用
兩個函式都是對file fp 檔案進行讀取資訊,fgets是每次讀取一行,fread是一下子讀完所有的檔案內容。1 一 fread的使用 23 file fp 4int nread 5char buf 4096 6 fp fopen proc cpuinfo rb 7 nread fread buf...