C 標準庫提供了豐富的輸入輸出函數,針對字符和字符串的讀寫有多種選擇。理解它們的行為差異、返回值以及邊界條件,對於編寫健壯的 C 程序至關重要。本文系統整理了常用的字符讀寫函數(fgetc、getc、getchar、fputc、putc、putchar)與字符串讀寫函數(fgets、gets、fputs、puts)的關鍵細節。
int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void);
unsigned char 轉換為 int 返回)。getchar() 等價於 getc(stdin),總是從標準輸入讀取。getc 可能被實現為宏,因此其參數不應有副作用;fgetc 保證是函數。EOF(通常為 -1)。int 類型接收返回值,以便區分有效字符與 EOF。int fputc(int c, FILE *stream); int putc(int c, FILE *stream); int putchar(int c);
c(轉為 unsigned char)寫入指定流。putchar(c) 等價於 putc(c, stdout),總是寫到標準輸出。putc 可能是宏,同樣避免參數副作用。EOF。char *fgets(char *buffer, int size, FILE *stream);
stream 讀取字符至 buffer,直到發生以下任一條件停止:
'\n',並將其存入 buffer;size - 1 個字符(為結尾的空字符留出空間)。'\0',構成合法 C 字符串。換行符若被讀到,會保留在字符串中(即 '\n' 之後才是 '\0')。buffer 指針;若讀到文件末尾或出錯且未讀到任何字符,返回 NULL。strlen 統計的長度包含換行符,但不包含結尾的 '\0'。char *gets(char *buffer);
stdin 讀取一行(直到 '\n' 或 EOF),但不存儲換行符,直接在末尾加 '\0'。int fputs(const char *buffer, FILE *stream);
buffer 必須以 '\0' 結尾。'\0')原樣寫入流。字符串中有多少個換行符就寫入多少個,沒有則不額外添加。EOF。int puts(const char *buffer);
stdout,同樣不寫入結尾 '\0',但會在末尾自動添加一個換行符。EOF。| 場景 | 推薦函數 | 避免使用 |
|---|---|---|
| 讀取單字符 | fgetc / getchar | |
| 寫入單字符 | fputc / putchar | |
| 讀取一行文本 | fgets | gets(不安全) |
| 寫入字符串到文件 | fputs | |
| 輸出字符串到控制台 | puts(自動換行)或 fputs + 手動換行 |
掌握這些細節,能幫助你避免常見的緩衝區溢出、換行符處理錯誤以及 EOF 判斷失誤,編寫出更安全、可移植的 C 代碼。