原型:char *gets(char *str);
標頭檔案:stdio.h
#include int main()
(1)在windows系統中的執行結果
hello
hello
(2)在linux中用gcc進行編譯
noilinux@ubuntu:~/desktop$ gcc test.c -o test
test.c: in function 『main』:
test.c:6:5: warning: 『gets』 is deprecated (declared at /usr/include/stdio.h:638) [-wdeprecated-declarations]
gets(str);
^/tmp/cc0hpgqa.o:在函式『main』中:
test.c:(.text+0x1d): 警告: the `gets' function is dangerous and should not be used.
執行結果
noilinux@ubuntu:~/desktop$ ./test
hello
hello
#include int main(void)
執行結果
在windows下輸入:
a
hi
輸出
string=hi
char=a
在windows下重新輸入
a
uvwxyz
輸出
string=uvw
char=x
這裡可以看出來,定義了s的長度為3,但是用gets()輸入字串的時候,並不會去檢查字串的長度,所以導致char的值不是a,而是」uvwxyz」中的第四個字元』x』。
不正確使用gets()函式的時候造成的危害是很大的,就像我們剛才看到的那樣,a的值被字串s溢位的值給替換了。
因為gets有不限制輸入字元個數的限制,可能會導致不法分子利用這一漏洞造成緩衝區溢位,從而達到破壞的目的。《c primer plus》中提到蠕蟲病毒就是利用這一漏洞來攻擊作業系統。
出於安全考慮,用fgets()來代替gets()。
原型:char * fgets(char * s, int n,file *stream);
標頭檔案:stdio.h
fgets()函式讀取到它所遇到的第乙個換行符的後面,或者讀取比字串的最大長度少乙個的字元,或者讀取到檔案結尾。然後fgets()函式向末尾新增乙個空字元以構成乙個字串。如果在達到字元最大數目之前讀完一行,它將在字串的空字元之前新增乙個換行符以標識一行結束。
#include #define len 5
int main()
執行結果
輸入:
a
uvwxyz
輸出:
string=uvwx
char=a
這裡string=uvwx的後面其實還有乙個空字元』\0』沒有顯示出來。
#include #include #define len 100
int main()
}printf("%d", total);
return 0;
}
小朋友學C語言(29) switch case語句
switch case語句與if elseif語句類似,都是從多個選擇條件裡選取乙個來執行。include int main else if 2 number else if 3 number else if 4 number else if 5 number else if 6 number el...
C語言gets 和get s 函式
介紹 gets 可以無限讀取,易發生溢位。如果溢位,多出來的字元將被寫入到堆疊中,這就覆蓋了堆疊原先的內容,破壞乙個或多個不相關變數的值,由於可以無限讀取,所以在2011年12月,ansi 採納了 iso iec 9899 2011 標準,標準中刪除了 gets 函式,使用乙個新的更安全的函式get...
小朋友學C語言(21) 字串
在 c 語言中,字串實際上是使用 null 字元 0 終止的一維字元陣列。一 下面是乙個定義字串的例子。由於在陣列的末尾儲存了空字元,所以字元陣列的大小比單詞 hello 的字元數多乙個。char str 但是在算字串的長度時,最後的空字元 0 不算在內。驗證程式 include include i...