c語(yǔ)言gets函數(shù)弊端 gets函數(shù)的缺點(diǎn)

C語(yǔ)言里的gets()函數(shù)

C語(yǔ)言里的 gets(),scanf() 都不檢查緩沖區(qū)是否會(huì)溢出。至于此“漏洞”有什么樣的風(fēng)險(xiǎn),我沒(méi)有體會(huì)。自己寫(xiě)的程序,自己用,沒(méi)有風(fēng)險(xiǎn)。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),中山企業(yè)網(wǎng)站建設(shè),中山品牌網(wǎng)站建設(shè),網(wǎng)站定制,中山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,中山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

如果別人寫(xiě)的程序,含惡意代碼,你也無(wú)可奈何,你不能叫別人用scanf()不用 gets()。

再說(shuō),

gets() 讀取一行字符串,包括空白(空格,tab...)。

scanf("%s",....) 它沒(méi)有 讀取一行 的功能,遇到 空白 就不讀下去了(它以空白為分隔符).

所以 scanf() 并不能代替 gets() 。

C語(yǔ)言gets()問(wèn)題

因?yàn)槟阍谑褂胓ets之前還使用過(guò)別的讀入函數(shù)(或宏),有的是不會(huì)把末尾的換行讀取掉的,就會(huì)留在緩沖區(qū),當(dāng)你調(diào)用gets時(shí),把上一次的換行字符給讀取了,所以就像直接跳過(guò)了。

改善的方法是為gets函數(shù)上一句加上getchar();用于吸收回車?;蚴羌觙flush(stdin);刷新緩沖區(qū)。

c語(yǔ)言為什么有函數(shù)危險(xiǎn)一說(shuō)??? 比如gets()的溢出操作等;

這是對(duì)程序產(chǎn)生BUG,出現(xiàn)不可靠性的一個(gè)描述,有些函數(shù)在某些意外情況會(huì)導(dǎo)致程序陷入不可控狀態(tài),僅僅是PC上運(yùn)行最多也就是退出而已,但是如果是運(yùn)行在飛機(jī)等系統(tǒng)里的話,就會(huì)有大麻煩,說(shuō)危險(xiǎn)也不為過(guò)。因?yàn)橛⑽奈墨I(xiàn)里描述為dangerous,所以也就翻譯為危險(xiǎn)。

函數(shù)執(zhí)行需要一個(gè)??臻g,但這個(gè)??臻g容量是有限的,而且棧里存放了函數(shù)返回的地址。

gets()函數(shù)在獲取輸入時(shí),如果無(wú)限輸入會(huì)造成??臻g溢出,在程序返回時(shí),不能正常的找到返回地址,程序?qū)l(fā)生不可預(yù)測(cè)行為

C語(yǔ)言中的gets函數(shù)問(wèn)題!

gets(str)有邊界溢出的可能。

比如你的str定義只有80個(gè)char單元,但輸入的時(shí)候卻輸入了80個(gè)以上的字符,那么就發(fā)生了溢出。c語(yǔ)言是不檢查邊界溢出的,編譯不報(bào)錯(cuò)。但溢出會(huì)破壞內(nèi)存中的數(shù)據(jù),產(chǎn)生不可預(yù)料的后果。所以要盡量避免。

但平常練習(xí)的時(shí)候gets()函數(shù)是經(jīng)常用到的,因?yàn)樗闷饋?lái)很方便。

我們現(xiàn)在所編寫(xiě)的程序主要是為了學(xué)習(xí)算法,并不是像專業(yè)程序員那樣要求嚴(yán)密性,減少BUG。所以你在給字符串定義了一個(gè)足夠大的長(zhǎng)度時(shí)用gets()沒(méi)關(guān)系。

話有說(shuō)回來(lái),保持一個(gè)嚴(yán)謹(jǐn)?shù)木幊田L(fēng)格也是很有必要的。你自己抉擇吧。

text是一個(gè)二維數(shù)組,gets(text[t])是給text[t]賦值。

在C語(yǔ)言中為什么gets函數(shù)有的時(shí)候不推薦用? 編譯的時(shí)候編譯器都會(huì)提示warning?

這是關(guān)系到信息安全領(lǐng)域的一些知識(shí)。

會(huì)有這樣的一個(gè)情況:

char a[12];

gets(a);

當(dāng)你輸入的東西遠(yuǎn)比12要長(zhǎng)時(shí),他還是會(huì)接收并寫(xiě)入空間。這樣就溢出了,覆蓋掉后面的相應(yīng)空間。也就是說(shuō)他寫(xiě)入了不該他來(lái)寫(xiě)的東西。如果寫(xiě)得設(shè)計(jì)好點(diǎn),完全可以通過(guò)這個(gè)去完成一些不好的事情。編譯器一般會(huì)提示你去換個(gè)安全的函數(shù),來(lái)避免這個(gè)情況。

C語(yǔ)言中g(shù)ets函數(shù)能否只接收一個(gè)換行符 如gets(a),輸入時(shí)輸入回車

由于scanf函數(shù)遇到空格后就停止輸入,如需要輸入一句話的話,要嘗試其他的函數(shù)例如gets()函數(shù)。

原型函數(shù)為char*gets(char*buffer),返回一個(gè)指向char的指針,返回的指針與傳遞給他的指針是同一個(gè)指針。

例子:

charname[20];

gets(name);

printf(“%s”,name);

此時(shí)在控制界面中輸入helloworld,輸出將會(huì)是helloworld。

上例同時(shí)也可以寫(xiě)成:

charname[20];

char*ptr;

ptr=gets(name);

printf(“%s”,name);

printf(“%s”,ptr);

此時(shí)兩句話輸出的都是helloworld,從而證明ptr的指針就是賦給gets函數(shù)的指針。但是gets()函數(shù)有一個(gè)缺點(diǎn),當(dāng)輸入的字符串的長(zhǎng)度大于申請(qǐng)的空間時(shí),會(huì)造成空間越界,此時(shí)在函數(shù)執(zhí)行結(jié)束釋放空間時(shí)會(huì)報(bào)錯(cuò)。

擴(kuò)展資料

1、輸出字符串的效果,寬度和精度同樣也適用于字符串。

3、put是需要遇到’\0’才會(huì)輸出的,因此通過(guò)字符串?dāng)?shù)組遍歷賦值時(shí),不要忘記加’\0’。

新聞名稱:c語(yǔ)言gets函數(shù)弊端 gets函數(shù)的缺點(diǎn)
本文路徑:http://muchs.cn/article26/hjcijg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、用戶體驗(yàn)、網(wǎng)站設(shè)計(jì)、網(wǎng)站排名、品牌網(wǎng)站設(shè)計(jì)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)