首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C 語言輸入輸出函數詳解:字符與字符串讀寫細節

     編輯:C++ 入門

概述

C 標準庫提供了豐富的輸入輸出函數,針對字符和字符串的讀寫有多種選擇。理解它們的行為差異、返回值以及邊界條件,對於編寫健壯的 C 程序至關重要。本文系統整理了常用的字符讀寫函數(fgetc、getc、getchar、fputc、putc、putchar)與字符串讀寫函數(fgets、gets、fputs、puts)的關鍵細節。

一、字符讀取函數

1. fgetc、getc、getchar

int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
  • 功能:從指定流中讀取下一個字符(以 unsigned char 轉換為 int 返回)。
  • 區別:
    • getchar() 等價於 getc(stdin),總是從標準輸入讀取。
    • getc 可能被實現為宏,因此其參數不應有副作用;fgetc 保證是函數。
  • 返回值:成功返回讀取的字符(0~255);若流無可讀字符或發生錯誤,返回 EOF(通常為 -1)。
  • 注意:必須用 int 類型接收返回值,以便區分有效字符與 EOF。

二、字符寫入函數

1. fputc、putc、putchar

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。

三、字符串讀取函數

1. fgets —— 推薦使用的安全讀行函數

char *fgets(char *buffer, int size, FILE *stream);
  • 讀取規則:從 stream 讀取字符至 buffer,直到發生以下任一條件停止:
    1. 讀到換行符 '\n',並將其存入 buffer;
    2. 已讀取 size - 1 個字符(為結尾的空字符留出空間)。
  • 結尾處理:無論哪種情況,都會在最後追加一個空字符 '\0',構成合法 C 字符串。換行符若被讀到,會保留在字符串中(即 '\n' 之後才是 '\0')。
  • 返回值:成功返回 buffer 指針;若讀到文件末尾或出錯且未讀到任何字符,返回 NULL。
  • 長度計算提示:strlen 統計的長度包含換行符,但不包含結尾的 '\0'。

2. gets —— 已棄用的危險函數

char *gets(char *buffer);
  • 行為:從 stdin 讀取一行(直到 '\n' 或 EOF),但不存儲換行符,直接在末尾加 '\0'。
  • 缺陷:不檢查緩衝區大小,極易導致緩衝區溢出,C11 標準已將其移除,嚴禁使用。

四、字符串寫入函數

1. fputs

int fputs(const char *buffer, FILE *stream);
  • 要求:buffer 必須以 '\0' 結尾。
  • 行為:將字符串內容(不含結尾 '\0')原樣寫入流。字符串中有多少個換行符就寫入多少個,沒有則不額外添加。
  • 返回值:成功返回非負值,失敗返回 EOF。

2. puts

int puts(const char *buffer);
  • 行為:將字符串寫入 stdout,同樣不寫入結尾 '\0',但會在末尾自動添加一個換行符。
  • 返回值:成功返回非負值,失敗返回 EOF。

五、最佳實踐總結

場景推薦函數避免使用
讀取單字符fgetc / getchar
寫入單字符fputc / putchar
讀取一行文本fgetsgets(不安全)
寫入字符串到文件fputs
輸出字符串到控制台puts(自動換行)或 fputs + 手動換行

掌握這些細節,能幫助你避免常見的緩衝區溢出、換行符處理錯誤以及 EOF 判斷失誤,編寫出更安全、可移植的 C 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved