看板 b92902xxx 關於我們 聯絡資訊
※ 引述《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