※ 引述《euphrate (*暴走狂愛.至死不渝~)》之銘言:
: 以下是我的程式碼片段:
: char line[SIZE * 5], ......;
: for (index = 0; gets(line) != NULL;) {
: sscanf(line, "%s", string);
: .
: .
: .
: .
: }
: 在gcc編譯時出現錯誤 何解?? (VC可以過ㄚ)
: b9202x@linux1:~> gcc b9290202x.c
: /tmp/ccwx5txs.o(.text+0x27): In function `main':
: : warning: the `gets' function is dangerous and should not be used.
: b9202x@linux1:~>
原則上這個 warning 不是說你語法或 function 用法有錯,
所以直接 ignore 即可...
但是...
gets 是一個很容易出現 buffer overflow 的 function,
因為你沒有告訴他 line 這個 char array 到底多大,
萬一 input line 超長的話呢?
你就算開了 1024 chars , 可能會有惡意使用者丟個好幾 K 進來,
甚至包含可以跑的 machine code ...
所以改用 fgets 來取代 gets 幾乎已經成為慣例了...
用法其實差不多, 以你的程式可以把 gets(line) != NULL 改成這樣:
fgets(line, SIZE*5, stdin) != NULL
效果完全一樣, 只差在 input line 過長 (超過 size) 的時候會被截斷,
避免 segmentation fault 之類的悲慘結果...
此外...
我用 fgets 之後, 還會習慣在最後一個 char 填 '\0';
因為呢, 萬一真的過長被截斷, 這個 char array 是沒有字串結束記號的,
所以接下來如果用 strlen() 之類的 function 去處理, 有可能跑不完...
所以動手處理字串之前我會再加這樣一行:
line[SIZE*5-1] = '\0';
好, 這樣一來這個 line buffer 應該就不會因為 input 的單行太長
而給你帶來麻煩了...
--
被遺忘的零度空間: bbs.csie.ntu.edu.tw
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.161.6.199