標準庫提供四個行導向 I/O 函數:fgets/gets(輸入)、fputs/puts(輸出)。它們對換行符 '\n' 處理方式不同,混用極易導致輸出多行或少行。本文以四組實測程式碼,徹底釐清行為差異,給出最佳實踐建議。
| 函數 | 讀取/寫入 '\n' | 緩衝區長度檢查 | 流向 |
|---|---|---|---|
fgets(buf, n, fp) | 保留 '\n'(若空間足夠) | 是(n-1 字元) | 任意 FILE* |
gets(buf) | 捨棄 '\n',不存入緩衝區 | 否(極危險) | 僅 stdin |
fputs(buf, fp) | 原樣輸出,不增刪 '\n' | N/A | 任意 FILE* |
puts(buf) | 補充 一個 '\n' 到 stdout | N/A | 僅 stdout |
while (fgets(buf, SIZE, stdin)) fputs(buf, stdout);
while (gets(buf)) puts(buf);
while (gets(buf)) fputs(buf, stdout);
while (fgets(buf, SIZE, stdin)) puts(buf);
fgets(buf, sizeof(buf), stdin) + 手動去尾部 '\n'。buf[strcspn(buf, "\n")] = '\0';fputs(buf, stdout); fputc('\n', stdout); 明確可控。fgets 留 '\n'、gets 吃 '\n';fputs 原樣、puts 加 '\n'。fgets/fputs 組合最安全、最正交,牢記此對應關係,告別換行亂碼與緩衝區溢位噩夢。