1. 程式人生 > >linux中gets()函式和fgets()函式

linux中gets()函式和fgets()函式

    在學習c語言時遇到這樣的問題,當需要輸入字串的時候,我們會用到gets()函式,當我們gcc編譯時會遇到一個警告,這讓我們程式設計時感覺很不爽。究其原因,就是gets()函式在輸入時沒有限定字串的長度,而linux是很嚴謹的,所以這裡給出一warning。
    但我們程式設計時會有很多的替代函式,例如fgets()函式就完全可以替代了gets()函式。
例如:輸入字串:char string[LENGTH];
gets(string);
fgets(string, LENGTH, stdin);
這樣就可以用fgets完美的替代了gets,而且還幫我們檢查了一個錯誤,萬一#define LENGTH 16,如果輸入了18個字元,會出現讓大家意想不到的結果。

我的測試結果分別是:
用scanf(),進行輸入時,如果你輸入的字元數大於16,輸出的是你輸入的你輸入的字元個數,而不是你當時定義的字串長度。即:
輸入 a = aaaaaaaaaaaaaaaaaaaaaaa
輸出 a = aaaaaaaaaaaaaaaaaaaaaaa

用gets(),進行輸入時,在編譯會給你一warning,但是當你輸入的長度大於定義時的長度時,在輸出時的結果是:
輸入 a = aaaaaaaaaaaaaaaaaaaaaaa
輸出
a = aaaaaaaaaaaaaaaaaaaaaaa

*** stack smashing detected ***: ./a.out terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0xc16390]
/lib/tls/i686/cmov/libc.so.6(+0xe233a)[0xc1633a]
./a.out[0x80484ce]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb4abd6]
./a.out[0x80483e1]
======= Memory map: ========
001a9000-001c4000 r-xp 00000000 08:06 1839106    /lib/ld-2.11.1.so
001c4000-001c5000 r--p 0001a000 08:06 1839106    /lib/ld-2.11.1.so
001c5000-001c6000 rw-p 0001b000 08:06 1839106    /lib/ld-2.11.1.so
00b34000-00c87000 r-xp 00000000 08:06 1839125    /lib/tls/i686/cmov/libc-2.11.1.so
00c87000-00c88000 ---p 00153000 08:06 1839125    /lib/tls/i686/cmov/libc-2.11.1.so
00c88000-00c8a000 r--p 00153000 08:06 1839125    /lib/tls/i686/cmov/libc-2.11.1.so
00c8a000-00c8b000 rw-p 00155000 08:06 1839125    /lib/tls/i686/cmov/libc-2.11.1.so
00c8b000-00c8e000 rw-p 00000000 00:00 0
00cfb000-00cfc000 r-xp 00000000 00:00 0          [vdso]
00eb2000-00ecf000 r-xp 00000000 08:06 1835093    /lib/libgcc_s.so.1
00ecf000-00ed0000 r--p 0001c000 08:06 1835093    /lib/libgcc_s.so.1
00ed0000-00ed1000 rw-p 0001d000 08:06 1835093    /lib/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:06 1048831    /home/qiao/c_program/3_program/list/a.out
08049000-0804a000 r--p 00000000 08:06 1048831    /home/qiao/c_program/3_program/list/a.out
0804a000-0804b000 rw-p 00001000 08:06 1048831    /home/qiao/c_program/3_program/list/a.out
09543000-09564000 rw-p 00000000 00:00 0          [heap]
b777e000-b777f000 rw-p 00000000 00:00 0
b778e000-b7792000 rw-p 00000000 00:00 0
bfcbc000-bfcd1000 rw-p 00000000 00:00 0          [stack]
已放棄
堆疊溢位,這在我們程式設計時是非常可怕的。所以以後要慎用。
推薦在字串輸入時用fgets()函式。
他會擷取我們開始定義時的長度,注意的一點是fgets()函式會給字串預留一個\0的位置,就是我們輸入了8個字元,輸出時只輸出7個有效字元。最後一個給了\0.

最後再補充一點:gets()和fgets()函式是就收回車的,而scanf()不接收回車。

就先說到這吧。
如果誰有不明白的,或者其他更好的用法時,我很樂意一起討論的。
我的郵箱:
[email protected]

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(2) | 評論(0) | 轉發(0) | 給主人留下些什麼吧!~~ 評論熱議