C語言中g(shù)ets函數(shù)與getchar函數(shù)的區(qū)別
新市網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),新市網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為新市成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的新市做網(wǎng)站的公司定做!
一、函數(shù)輸入方面
1、gets()函數(shù)用來從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)讀取字符串直到回車結(jié)束,但回車符不屬于這個(gè)字符串。其調(diào)用格式為:gets(s);s為字符串變量(字符串?dāng)?shù)組名或字符串指針),gets(s)函數(shù)與scanf("%s", s)相似,但不完全相同。
2、而getchar函數(shù)運(yùn)行時(shí)字符是連續(xù)輸入的,運(yùn)行結(jié)果卻是正確的,這是因?yàn)檩斎胱址?,它們暫存于鍵盤的緩沖區(qū)中,然后由getchar函數(shù)從鍵盤緩沖區(qū)中一個(gè)一個(gè)的取出來。就是如果輸入了空格會(huì)認(rèn)為輸入字符串結(jié)束,空格后的字符將作為下一個(gè)輸入項(xiàng)處理,但gets() 函數(shù)將接收輸入的整個(gè)字符串直到回車為止。
二、字符輸入方面
1、gets()函數(shù)可以用于對(duì)字符串的輸入,不需要將字符串拆分成一個(gè)一個(gè)的字符進(jìn)行輸入。
2、而getchar函數(shù)只能用于單個(gè)字符的輸入,一次輸入一個(gè)字符。程序的功能是輸入一個(gè)字符,顯示一個(gè)字符,回車換行,再輸入并顯示一個(gè)字符。
三、輸出格式
1、gets函數(shù)是輸入一行字符串,以回車結(jié)束,并且回車鍵會(huì)被過濾掉,不會(huì)被讀回到字符串中。
2、而getchar()是讀答取一個(gè)字符,包括回車鍵也會(huì)被讀成一個(gè)字符。這個(gè)程序在輸入name[i]前,用getchar()把之前scanf("%d",num[i]);中,輸入整數(shù)后按的回車鍵給讀走,否則這個(gè)回車鍵會(huì)導(dǎo)致gets直接讀到一個(gè)空字符串。
1、gets() 函數(shù)是從鍵盤輸入字符串,該函數(shù)只有一個(gè)參數(shù)。參數(shù)類型為 char* 型,即 str 可以是一個(gè)字符指針變量名,也可以是一個(gè)字符數(shù)組名。打開編輯器,新建一個(gè)c語言文件,引入標(biāo)準(zhǔn)庫并新建主函數(shù):
2、gets() 函數(shù)的功能是從輸入緩沖區(qū)中讀取一個(gè)字符串存儲(chǔ)到字符指針變量 str 所指向的內(nèi)存空間,這里的程序是用gets函數(shù)輸入字符串,可以看到不像scanf那樣需要使用%號(hào),gets函數(shù)中直接傳入字符串即可:
3、最后運(yùn)行下程序,輸入“i love you”,可以看到gets函數(shù)可以直接輸出空格,而scanf函數(shù)輸出空格則需要使用轉(zhuǎn)義字符實(shí)現(xiàn),因此gets函數(shù)的使用要比scanf簡(jiǎn)潔的多。以上就是gets函數(shù)使用方法的演示:
對(duì)的,確實(shí)有舉出漏洞。以下是個(gè)人建議,希望對(duì)樓主有所幫助。
首先我們應(yīng)該先認(rèn)識(shí)一下gets和scanf的語法解構(gòu)。如果要給一個(gè)字符串賦值,那我們可以這樣做。
int
a[10];
gets(a);
或是
for(i=0;i10;i++)
scanf("%d",a[i]);
由上我們可以看出,scanf每次只能輸入一個(gè)字符,然后回車,繼續(xù)循環(huán)。
而gets呢,需要把所有的字符串都輸入完后回車結(jié)束。這就造成了一個(gè)問題。
如果我們輸入的字符串多于10個(gè)單位呢?我們輸入的“a[20]”個(gè)空間的字符。
這就可能會(huì)產(chǎn)生溢出漏洞。
僅代表個(gè)人建議,希望對(duì)樓主有所幫助。
舉例說明下:
比如有:
char s[10];
gets_s(s,5); //最大只允許讀取5個(gè)字符(包括換行)
運(yùn)行時(shí)輸入了 abcdefg, 那么gets_s函數(shù)讀取到第5個(gè)字符還沒有讀到換行符,于是把s[0]弄成空字符'\0',然后清空輸入緩沖區(qū)(就是把后面的fg和回車符都清理掉了)
很多帶“_s”后綴的函數(shù)是為了讓原版函數(shù)更安全,傳入一個(gè)和參數(shù)有關(guān)的大小值,避免引用到不存在的元素,有時(shí)hacker可以利用原版的不安全性黑掉系統(tǒng)。
單獨(dú)寫gets_s(a)是不正確的,需要傳入一個(gè)a的長(zhǎng)度,改成gets_s(a,10)
告訴gets_s函數(shù)最多只能接收10個(gè)字符進(jìn)來。
二者都是從終端讀入字符串。功能為
1、 gets功能為讀入一行,并將換行符轉(zhuǎn)換為字符串結(jié)束符。
2、 scanf("%s",s);讀入時(shí),遇到空白字符,包括空格,制表符,換行符時(shí)均會(huì)停止輸入。
從功能上可以看出不同之處:
1 終止條件不同。gets只有遇到\n時(shí)才會(huì)結(jié)束輸入,而scanf遇到空格或制表符時(shí),也會(huì)結(jié)束輸入。
比如輸入"test string\n"。
用gets得到的字符串為"test string", 二用scanf得到的是"test"。
2 終止后,對(duì)終止字符處理不同。
比如輸入為"test\nabcd"。
執(zhí)行g(shù)ets后,\n不會(huì)留在緩沖區(qū)中,即這時(shí)調(diào)用getchar得到的字符是'a'。
執(zhí)行scanf后,\n會(huì)留在緩沖區(qū),這時(shí)調(diào)用getchar得到的字符是'\n'。