| 函數組 | 聲明 | 流參數 |
|---|---|---|
| fgets/fputs | char *fgets(char *s, int n, FILE *stream); | 需指定 FILE* |
| gets/puts | char *gets(char *s); | 隱式 stdin/stdout |
| getchar/putchar | int getchar(void); | 隱式 stdin/stdout |
| fgetc/fputc | int fgetc(FILE *stream); | 需指定 FILE* |
| getc/putc | int getc(FILE *stream); | 需指定 FILE* |
| fscanf/scanf/sscanf | int fscanf(FILE *stream, const char *fmt, ...); | 文件/標準輸入/字符串 |
fgets vs gets —— 安全性的分水嶺fgets(s, n, stream):讀取最多 n-1 字符,**保留換行符 \n**,防止緩衝區溢出。**首選函數**。gets(s):**無長度限制**,遇換行符停止並**丟棄 \n**,極易導致緩衝區溢出,**C11 標準已移除**,嚴禁使用。fgets 讀入保留 \n,fputs **不自動添加 \n**;gets 丟棄 \n,puts **自動添加 \n**。混用會導致換行數量錯亂。fgetc/fputc vs getc/putc/getchar/putcharfgetc/fputc 是真函數:有地址,可作函數指針,代碼體積小,調用有函數開銷。__STDIO_INLINE 或 #define):預處理展開,執行效率略高,但增加代碼體積,無法取地址。getchar() 等價 getc(stdin),putchar(c) 等價 putc(c, stdout)。_IO_getc_unlocked 等無鎖版本,需注意線程安全(通常由上層 flockfile 保護)。getchar vs fgetsgetchar:逐字符讀取,返回 int(為了容納 EOF 這一負值),適合逐字符處理。fgets/gets:按行讀取字符串,適合文本行處理。scanf / fscanf / sscanfscanf(fmt, ...):從 stdin 讀取。fscanf(stream, fmt, ...):從指定文件流讀取。sscanf(str, fmt, ...):從內存字符串 解析,**不涉及 I/O**,極其適合字符串解析(如 HTTP 請求、配置文件行解析)。sscanf 不受流狀態影響,更安全可控。fgets + sscanf:fgets 安全讀行,sscanf 解析,徹底避免 scanf 留在緩衝區的換行符導致後續讀取異常。getchar/fgetc,區分 EOF 與有效字符(返回值用 int 接收)。fputs/fputc/fprintf 顯式指定流,避免隱式 stdout 依賴。gets,編譯器會報警;禁用 scanf("%s", buf) 無寬度限制讀字符串。