c語言的gets
⑴ c語言gets函數
是的,如果這是某書上的做法,那麼,我只能說它為你們提供了一個錯誤的榜樣。
這樣使用gets()已經發生了溢出!這是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函數與getchar函數有什麼區別
C語言中gets函數與getchar函數的區別
一、函數輸入方面
1、gets()函數用來從標准輸入設備(鍵盤)讀取字元串直到回車結束,但回車符不屬於這個字元串。其調用格式為:gets(s);s為字元串變數(字元串數組名或字元串指針),gets(s)函數與scanf("%s", &s)相似,但不完全相同。
2、而getchar函數運行時字元是連續輸入的,運行結果卻是正確的,這是因為輸入字元後,它們暫存於鍵盤的緩沖區中,然後由getchar函數從鍵盤緩沖區中一個一個的取出來。就是如果輸入了空格會認為輸入字元串結束,空格後的字元將作為下一個輸入項處理,但gets() 函數將接收輸入的整個字元串直到回車為止。
二、字元輸入方面
1、gets()函數可以用於對字元串的輸入,不需要將字元串拆分成一個一個的字元進行輸入。
2、而getchar函數只能用於單個字元的輸入,一次輸入一個字元。程序的功能是輸入一個字元,顯示一個字元,回車換行,再輸入並顯示一個字元。
三、輸出格式
1、gets函數是輸入一行字元串,以回車結束,並且回車鍵會被過濾掉,不會被讀回到字元串中。
2、而getchar()是讀答取一個字元,包括回車鍵也會被讀成一個字元。這個程序在輸入name[i]前,用getchar()把之前scanf("%d",&num[i]);中,輸入整數後按的回車鍵給讀走,否則這個回車鍵會導致gets直接讀到一個空字元串。
⑶ C語言gets函數的用法,能用代碼舉個例子么
c語言,gets()函數用來從標准輸入設備(鍵盤)讀取字元串直到換行符結束,但換行符會被丟棄,然後在末尾添加'