在前面從鍵盤輸入字符串是使用 scanf 和 %s。其實還有更簡單的方法,即使用 gets() 函數。該函數的原型為:
創(chuàng)新互聯是一家以網站建設公司、網頁設計、品牌設計、軟件運維、營銷推廣、小程序App開發(fā)等移動開發(fā)為一體互聯網公司。已累計為成都人造霧等眾行業(yè)中小客戶提供優(yōu)質的互聯網建站和軟件開發(fā)服務。
# include stdio.h
char *gets(char *str);
這個函數很簡單,只有一個參數。參數類型為 char* 型,即 str 可以是一個字符指針變量名,也可以是一個字符數組名。gets() 函數的功能是從輸入緩沖區(qū)中讀取一個字符串存儲到字符指針變量 str 所指向的內存空間。
下面將前面中使用 scanf 輸入字符串的程序改一下:
# include stdio.h
int main(void)
{
char str[20] = "\0";? //字符數組初始化\0
printf("請輸入字符串:");
gets(str);
printf("%s\n", str);
return 0;
}
輸出結果是:
請輸入字符串:i love you
i love you
擴展資料:
從stdin流中讀取字符串,直至接受到換行符或EOF時停止,并將讀取的結果存放在buffer指針所指向的字符數組中。換行符不作為讀取串的內容,讀取的換行符被轉換為‘\0’空字符,并由此來結束字符串。
讀入成功,返回與參數buffer相同的指針;
讀入過程中遇到EOF(End-of-File)或發(fā)生錯誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferror或feof函數檢查是發(fā)生錯誤還是遇到EOF。
參考資料來源:百度百科-gets
gets()函數用于從緩沖區(qū)中讀取字符串,其原型如下:
char *gets(char *string);
gets()函數從流中讀取字符串,直到出現換行符或讀到文件尾為止,最后加上NULL作為字符串結束。所讀取的字符串暫存在給定的參數string中。
【返回值】若成功則返回string的指針,否則返回NULL。
注意:由于gets()不檢查字符串string的大小,必須遇到換行符或文件結尾才會結束輸入,因此容易造成緩存溢出的安全性問題,導致程序崩潰,可以使用fgets()代替。
擴展資料:
功能
從stdio流中讀取字符串,直至接受到換行符或EOF時停止,并將讀取的結果存放在buffer指針所指向的字符數組中。換行符不作為讀取串的內容,讀取的換行符被轉換為‘\0’空字符,并由此來結束字符串。
返回值
讀入成功,返回與參數buffer相同的指針;讀入過程中遇到EOF(End-of-File)或發(fā)生錯誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferror或feof函數檢查是發(fā)生錯誤還是遇到EOF。
注意
本函數可以無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執(zhí)行讀操作時不發(fā)生溢出。如果溢出,多出來的字符將被寫入到堆棧中,這就覆蓋了堆棧原先的內容,破壞一個或多個不相關變量的值。
這個事實導致gets函數只適用于玩具程序,為了避免這種情況,我們可以用fgets(stdin) (fgets實際上可以讀取標準輸入(即大多數情況下的鍵盤輸入),具體參閱fgets詞條)來替換gets()。在V7的手冊(1979年)中說明:為了向后兼容,gets刪除換行符,gets并不將換行符存入緩沖區(qū)。
參考資料:百度百科-gets
是的,如果這是某書上的做法,那么,我只能說它為你們提供了一個錯誤的榜樣。
這樣使用gets()已經發(fā)生了溢出!這是gets()不檢查數據邊界的bug造成的。
另外,“字符串不是總是以'\0'作為串的結束符”,答案是肯定的,不然puts()函數就不能在合適的地方停下來了。這里st[15]被gets()函數賦值為'\0'。這里要說明的是st[15],st[16]是存在而不合法的,因為字符串實際上就等同于指針,類似st[16]是實在的地址但是是不應該被引用的。
為什么這里溢出沒有產生錯誤?可能系統分配內存是以一個最小的大小整段整段的分配(這個我只是猜測)。你可以試著輸入的字符串變長一點,就可以看到內存讀寫出錯的提示了,這就是溢出的嚴重后果!我在DOS系統下測試字符串長了直接當機。
驗證1:st[15]被賦值為'\0'
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
驗證2:
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1]='\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同樣的建議:拒絕gets(),這本來就是一個有bug的函數!
c語言里gets(a) 表示輸入一個字符串到數組a,a表示讀取一個字符串存入a中,字符串輸入結束標志為換行符。
gets從標準輸入設備讀字符串函數,其可以無限讀取,不會判斷上限,以回車結束讀取,所以程序員應該確保buffer的空間足夠大,以便在執(zhí)行讀操作時不發(fā)生溢出。
擴展資料:
注意
因為本函數可以無限讀取,易發(fā)生溢出。如果溢出,多出來的字符將被寫入到堆棧中,這就覆蓋了堆棧原先的內容,破壞一個或多個不相關變量的值。
這個事實導致gets函數只適用于玩具程序,為了避免這種情況,我們可以用fgets(stdin) (fgets實際上可以讀取標準輸入,即大多數情況下的鍵盤輸入),具體參閱fgets詞條)來替換gets()。在V7的手冊(1979年)中說明:為了向后兼容,gets刪除換行符,gets并不將換行符存入緩沖區(qū)。
由于可以無限讀取,所以在2011年12月,ANSI 采納了 ISO/IEC 9899:2011 標準,標準中刪除了 gets()函數,使用一個新的更安全的函數gets_s()替代(具體用法看下面示例)。
參考資料來源:百度百科-gets函數
1、gets() 函數是從鍵盤輸入字符串,該函數只有一個參數。參數類型為 char* 型,即 str 可以是一個字符指針變量名,也可以是一個字符數組名。打開編輯器,新建一個c語言文件,引入標準庫并新建主函數:
2、gets() 函數的功能是從輸入緩沖區(qū)中讀取一個字符串存儲到字符指針變量 str 所指向的內存空間,這里的程序是用gets函數輸入字符串,可以看到不像scanf那樣需要使用%號,gets函數中直接傳入字符串即可:
3、最后運行下程序,輸入“i love you”,可以看到gets函數可以直接輸出空格,而scanf函數輸出空格則需要使用轉義字符實現,因此gets函數的使用要比scanf簡潔的多。以上就是gets函數使用方法的演示: