小朋友學C語言(42) gets和fgets

2021-09-01 13:26:01 字數 1836 閱讀 7844

原型: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...