gets,fgets,gets s的區別分析

2021-10-23 11:19:05 字數 2459 閱讀 7001

在最開始學習字串時,我們最常用的輸入字串函式就是——gets();

這個函式將輸入緩衝區中的資料儲存到字元型陣列中,以換行符結束,並丟棄末尾的換行符新增乙個空字元。他解決了scanf("%s",str);以空白符為截至的漏洞。

但是這個函式有乙個致命的弱點——不能對陣列溢位做出相應的處理

我們都知道,在我們定義陣列時先要確定陣列的大小,系統會分配一段沒被使用的連續空間給這個陣列。在這片區域外,我們不知道其他的空間是否被使用,這就帶來了乙個問題——如果陣列越界時,會存在安全隱患,但是gets函式並沒有處理這種越界問題的機制。

比如:

#include

這是乙個簡單的輸入輸出**,但是我們在一開始定義陣列時只分配了10個儲存空間,而我往輸入快取區中輸入了超過10的資料,gets函式將換行符之前的資料全都存進了ch陣列。

眾所周知,ch實際就是ch陣列的頭指標,gets從ch的頭位址依次按記憶體順序存入資料,這本身並沒有問題,但是我們在定義陣列ch時只關心ch可不可以存入10個資料,這10個資料之外的地方有沒有存資料我們是不知道的。

如果湊巧,沒有存入資料,這並沒有關係;但如果存入了,就會將原來的資料覆蓋。這會導致很大的安全隱患。而gets函式並沒有檢查是否存在這種陣列越界。

由此誕生了gets的替代品。

fgets函式並不像gets那樣只能從標準中讀取資料,他更常用在讀取檔案中的資料。

fgets()需要傳入三個引數,依次是要讀入的物件,讀入字元的最大數量,要讀入的檔案。

如果是要在標準輸入中讀入,將第三個引數設定為stdin(在stdio.h)中。

示例如:

#include

intmain()

輸出結果顯示,fgets函式只會將第二個引數指定大小的字元讀入字元陣列中(包括換行符)。如果輸入不足10就輸入換行符,則將字元包括換行符讀入字元陣列中。

還是輸入輸出的程式,這次我們輸入的字元數小於可讀入的最大字元數。我們依次輸入了 『a』,『b』,『c』,』\n』 ,fgets將這四個字元都讀入到了陣列ch中,與gets有區別的是,他沒有將末尾的換行符丟棄並新增乙個空字元 『\0』 ,而是直接將末尾的換行符保留下來了。

如果要將換行符換成空字元,需人為進行操作。

操作如下(將 『\n』 換成 『\0』 ):

上述**中我們將末尾的 『\n』 換成了 『\0』 ,輸出陣列ch時,沒有再輸出乙個換行符。

通過之前的例子我們已經知道,fgets函式最多隻會讀入指定的字元數,那那些沒有讀入的字元會何去何從呢?

先看下面的例子:

我們先輸入了一句話 「i will ba a niubide girl」 。頭10個字元是 「i will ba」,fgets將他讀入到陣列ch中。緊接著的10個字元 「 a niubid」 ,fgets將他讀入到陣列sh中,後面的 『e』 讀入到 dh 中。後面的字元 「 girl」 我相信他也沒用被丟棄,而是還在輸入快取區中。由此我們看出,fgets並沒有將沒有讀入的資料丟棄,他們依然在輸入快取區中等待著之後的資料的讀取。

有時你想將之後的資料進行丟棄。如下操作:

#include

intmain()

對於末尾換行符的處理,在不超過陣列範圍時 gets_s 丟棄他而不是儲存他,這點和 gets 一樣和 fgets 不一樣。

當我們向輸入快取區中輸入多於陣列的字元數時,gets_s會將多餘的字元丟棄以達到避免存在安全隱患的目的,不論你是否需要後面的字元。..

...這時三種情況都差不太多,有區別的是 gets 和 gets_s 會丟棄 『\n』 新增乙個 『\0』 ,而 fgets會保留末尾的換行符。

gets會將資料全都讀入陣列,從陣列的頭位址開始依次讀入。若越界後有資料則會覆蓋原始 資料,從而存在安全隱患。

fgets唯讀入指定的資料大小,剩下的資料依然在輸入緩衝區中。

gets_s唯讀入陣列最大可讀大小,剩下的資料全部丟棄。

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...

存在的就是合理的,發生的即是必然的。

筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...

Apache的rewrite的重寫相關的引數

apache mod rewrite規則重寫的標誌一覽 使用mod rewrite時常用的伺服器變數 rewriterule規則表示式的說明 匹配任何單字元 chars 匹配字串 chars chars 不匹配字串 chars text1 text2 可選擇的字串 text1或text2 匹配0到1...