char *fgets(char *s, int n, FILE *stream);
參數說明:
s --
指定存放所讀取的數據的位置
n -- 指定所讀取數據的最大長度(這個最大長度包括了字符串結束符 \0
所占據的存儲空間,因此,實際最大讀取的有效字符數是 n - 1)
stream --
數據源,是一個文件指針
fgets
函數用于從“輸入”字符串中讀取指定長度的字符串。這個“輸入”字符串既可以是通過fopen等開啟的文件流,也可以是直接從鍵盤鍵入的
stdin。通俗點說就是,它既可以從一個文本文件中一行、一行地(當然,還需要循環控制語句的配合)讀取字符串,又可以直接讀取從終端鍵入的字符串。
結合函數原型中的參數來解釋一下這個函數的用途:
從文件流(文件指針 stream)或標準輸入流(stdin)中最多讀取 n
- 1 個字符,并將它們存儲到以 s 為起始地址的內存空間里。
fgets 函數將在以下情況下,停止讀取:
1、在讀取過程中,遇到換行符 \n
2、在讀取過程中,遇到EOF
3、在讀取過程中,讀取的字符數達到最大限制(已經讀取了 n - 1 個)
如果函數執行成功,則返回 s,否則返回 NULL。
fgets 在成功讀取字符后,讀取的字符串內容以及當前指針所處的狀態如下:
strA:目標字符串(如果數據源是文本流,則為 當前行)
strB:讀取到的字符串內容
LEN:函數調用時指定的最大讀取字符數
情況一:當 strA 的長度?大于?LEN?時
strB 為:從?strA?開始處獲取到的 LEN?- 1 個字符
指針狀態:指針偏移至當前讀取完的這個字符之后的位置
例如:
strA?長度為10,LEN 為?5,此時 strB?的內容為 strA?的前4個(取
LEN?- 1 個)字符,指針指向 strA 的第5個字符處。
當下一次調用 fgets 函數時,會從 strA 的第5個字符開始讀取。
情況二:當 strA + 2(一個字符長度用于存儲在終端鍵入回車后 or strA 自身(行尾,如果是文本流)的換行符
\n,另一個字符長度用于存儲字符串本身的結束標識 \0)?的長度?小于?LEN?時
strB 為:strA + 行尾或終端鍵入回車后的換行符 \n,以及自動追加的字符串結束符 \0
指針狀態:指針偏移至下一行
例如:
strA?長度為10,LEN 為 15,此時?strB?的內容為?strA\n\0。
fgets 函數的優點是:
1、讀取到的換行符被保存到讀取結果中
2、操作的數據源不僅限于標準輸入流 stdin
3、允許指定讀取字符串的最大長度,有效避免了緩沖區溢出的問題。
BTW:strlen() 的計算結果,是不包括結束符 \0 的~
原文:http://www.cnblogs.com/MyRobotDream/p/3548567.html