C語言里的 gets(),scanf() 都不檢查緩沖區(qū)是否會(huì)溢出。至于此“漏洞”有什么樣的風(fēng)險(xiǎn),我沒有體會(huì)。自己寫的程序,自己用,沒有風(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ò)營銷,網(wǎng)絡(luò)優(yōu)化,中山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
如果別人寫的程序,含惡意代碼,你也無可奈何,你不能叫別人用scanf()不用 gets()。
再說,
gets() 讀取一行字符串,包括空白(空格,tab...)。
scanf("%s",....) 它沒有 讀取一行 的功能,遇到 空白 就不讀下去了(它以空白為分隔符).
所以 scanf() 并不能代替 gets() 。
因?yàn)槟阍谑褂胓ets之前還使用過別的讀入函數(shù)(或宏),有的是不會(huì)把末尾的換行讀取掉的,就會(huì)留在緩沖區(qū),當(dāng)你調(diào)用gets時(shí),把上一次的換行字符給讀取了,所以就像直接跳過了。
改善的方法是為gets函數(shù)上一句加上getchar();用于吸收回車?;蚴羌觙flush(stdin);刷新緩沖區(qū)。
這是對(duì)程序產(chǎn)生BUG,出現(xiàn)不可靠性的一個(gè)描述,有些函數(shù)在某些意外情況會(huì)導(dǎo)致程序陷入不可控狀態(tài),僅僅是PC上運(yùn)行最多也就是退出而已,但是如果是運(yùn)行在飛機(jī)等系統(tǒng)里的話,就會(huì)有大麻煩,說危險(xiǎn)也不為過。因?yàn)橛⑽奈墨I(xiàn)里描述為dangerous,所以也就翻譯為危險(xiǎn)。
函數(shù)執(zhí)行需要一個(gè)??臻g,但這個(gè)??臻g容量是有限的,而且棧里存放了函數(shù)返回的地址。
gets()函數(shù)在獲取輸入時(shí),如果無限輸入會(huì)造成??臻g溢出,在程序返回時(shí),不能正常的找到返回地址,程序?qū)l(fā)生不可預(yù)測行為
gets(str)有邊界溢出的可能。
比如你的str定義只有80個(gè)char單元,但輸入的時(shí)候卻輸入了80個(gè)以上的字符,那么就發(fā)生了溢出。c語言是不檢查邊界溢出的,編譯不報(bào)錯(cuò)。但溢出會(huì)破壞內(nèi)存中的數(shù)據(jù),產(chǎn)生不可預(yù)料的后果。所以要盡量避免。
但平常練習(xí)的時(shí)候gets()函數(shù)是經(jīng)常用到的,因?yàn)樗闷饋砗芊奖恪?/p>
我們現(xiàn)在所編寫的程序主要是為了學(xué)習(xí)算法,并不是像專業(yè)程序員那樣要求嚴(yán)密性,減少BUG。所以你在給字符串定義了一個(gè)足夠大的長度時(shí)用gets()沒關(guān)系。
話有說回來,保持一個(gè)嚴(yán)謹(jǐn)?shù)木幊田L(fēng)格也是很有必要的。你自己抉擇吧。
text是一個(gè)二維數(shù)組,gets(text[t])是給text[t]賦值。
這是關(guān)系到信息安全領(lǐng)域的一些知識(shí)。
會(huì)有這樣的一個(gè)情況:
char a[12];
gets(a);
當(dāng)你輸入的東西遠(yuǎn)比12要長時(shí),他還是會(huì)接收并寫入空間。這樣就溢出了,覆蓋掉后面的相應(yīng)空間。也就是說他寫入了不該他來寫的東西。如果寫得設(shè)計(jì)好點(diǎn),完全可以通過這個(gè)去完成一些不好的事情。編譯器一般會(huì)提示你去換個(gè)安全的函數(shù),來避免這個(gè)情況。
由于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í)也可以寫成:
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)輸入的字符串的長度大于申請(qǐng)的空間時(shí),會(huì)造成空間越界,此時(shí)在函數(shù)執(zhí)行結(jié)束釋放空間時(shí)會(huì)報(bào)錯(cuò)。
擴(kuò)展資料
1、輸出字符串的效果,寬度和精度同樣也適用于字符串。
3、put是需要遇到’\0’才會(huì)輸出的,因此通過字符串?dāng)?shù)組遍歷賦值時(shí),不要忘記加’\0’。