1、gets() 函數(shù)是從鍵盤(pán)輸入字符串,該函數(shù)只有一個(gè)參數(shù)。參數(shù)類(lèi)型為 char* 型,即 str 可以是一個(gè)字符指針變量名,也可以是一個(gè)字符數(shù)組名。打開(kāi)編輯器,新建一個(gè)c語(yǔ)言文件,引入標(biāo)準(zhǔn)庫(kù)并新建主函數(shù):
創(chuàng)新互聯(lián)建站長(zhǎng)期為1000+客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為順昌企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站制作、做網(wǎng)站,順昌網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
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ù)使用方法的演示:
gets從標(biāo)準(zhǔn)輸入設(shè)備讀字符串函數(shù),其可以無(wú)限讀取,不會(huì)判斷上限,以回車(chē)結(jié)束讀取,所以程序員應(yīng)該確保buffer的空間足夠大,以便在執(zhí)行讀操作時(shí)不發(fā)生溢出。
從stdio流中讀取字符串,直至接受到換行符或EOF時(shí)停止,并將讀取的結(jié)果存放在buffer指針?biāo)赶虻淖址麛?shù)組中。換行符不作為讀取串的內(nèi)容,讀取的換行符被轉(zhuǎn)換為‘\0’空字符,并由此來(lái)結(jié)束字符串。
返回值編輯
讀入成功,返回與參數(shù)buffer相同的指針;讀入過(guò)程中遇到EOF(End-of-File)或發(fā)生錯(cuò)誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferror或feof函數(shù)檢查是發(fā)生錯(cuò)誤還是遇到EOF。
注意
本函數(shù)可以無(wú)限讀取,不會(huì)判斷上限,所以程序員應(yīng)該確保buffer的空間足夠大,以便在執(zhí)行讀操作時(shí)不發(fā)生溢出。如果溢出,多出來(lái)的字符將被寫(xiě)入到堆棧中,這就覆蓋了堆棧原先的內(nèi)容,破壞一個(gè)或多個(gè)不相關(guān)變量的值。這個(gè)事實(shí)導(dǎo)致gets函數(shù)只適用于玩具程序,為了避免這種情況,我們可以用fgets(stdin) (fgets實(shí)際上可以讀取標(biāo)準(zhǔn)輸入(即大多數(shù)情況下的鍵盤(pán)輸入),具體參閱fgets詞條)來(lái)替換gets()。在V7的手冊(cè)(1979年)中說(shuō)明:為了向后兼容,gets刪除換行符,gets并不將換行符存入緩沖區(qū)。
由于可以無(wú)限讀取,所以在2011年12月,ANSI 采納了 ISO/IEC 9899:2011 標(biāo)準(zhǔn),標(biāo)準(zhǔn)中刪除了 gets()函數(shù),使用一個(gè)新的更安全的函數(shù)gets_s()替代(具體用法看下面示例)。
#include stdio.h //這個(gè)頭文件包含gets()函數(shù),這個(gè)函數(shù)在ISO/IEC 9899 2011(C11)標(biāo)準(zhǔn)中被移除
int main(void)
{
char str1[5]; //不要char*p,然后gets(p),這是錯(cuò)誤的,因?yàn)閜沒(méi)有指向有效的內(nèi)存,它可能指向任何非法地址 // 地方的未知大小的內(nèi)存塊,這樣以來(lái),就可能修改了不屬于本程序的內(nèi)存的內(nèi)容
gets(str1);
printf("%s\n", str1);
return 0;
}
#include stdio.h//gets_s()用法
#define CH 20
int main(void)
{
char ch[CH];
printf("請(qǐng)輸入你的名字:\n");
gets_s(ch,CH); //這里不能用gets_s(ch);
printf("這是你的名字:%s\n", ch);
return 0;
}
c語(yǔ)言,gets()函數(shù)用來(lái)從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))讀取字符串直到換行符結(jié)束,但換行符會(huì)被丟棄,然后在末尾添加'\0'字符。其調(diào)用格式為:gets(s)。其中s為字符串變量(字符串?dāng)?shù)組名或字符串指針)。如果為單個(gè)字符指針,編譯連接不會(huì)有錯(cuò)誤,但運(yùn)行后內(nèi)存溢出錯(cuò)誤。
擴(kuò)展資料:
gets(s)函數(shù)與scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函數(shù)輸入字符串時(shí)存在一個(gè)問(wèn)題,就是如果輸入了空格會(huì)認(rèn)為字符串結(jié)束,空格后的字符將作為下一個(gè)輸入項(xiàng)處理,但gets()函數(shù)將接收輸入的整個(gè)字符串直到遇到換行為止。
gets(s)函數(shù)可以無(wú)限讀取,不會(huì)判斷上限,以回車(chē)結(jié)束讀取,所以程序員應(yīng)該確保buffer的空間足夠大,以便在執(zhí)行讀操作時(shí)不發(fā)生溢出。
不需要的。
gets函數(shù)的頭文件:#include stdio.h
gets()函數(shù)用于從緩沖區(qū)中讀取字符串,其原型如下:
char *gets(char *string);
gets()函數(shù)從流中讀取字符串,直到出現(xiàn)換行符或讀到文件尾為止,最后加上NULL作為字符串結(jié)束。所讀取的字符串暫存在給定的參數(shù)string中。
【返回值】若成功則返回string的指針,否則返回NULL。
注意:由于gets()不檢查字符串string的大小,必須遇到換行符或文件結(jié)尾才會(huì)結(jié)束輸入,因此容易造成緩存溢出的安全性問(wèn)題,導(dǎo)致程序崩潰,可以使用fgets()代替。
網(wǎng)站名稱(chēng):c語(yǔ)言gets函數(shù)頭 c語(yǔ)言getch函數(shù)的頭文件
網(wǎng)站網(wǎng)址:http://muchs.cn/article46/ddigihg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、用戶(hù)體驗(yàn)、外貿(mào)建站、動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)