一、概述
调用fgets的流只有在以下3种情况下才会刷出缓冲区(即函数返回):
- 遇上换行符;
- 填满自定义缓冲区的指定长度n - 1个字节,也就是说假设自定义缓冲区长度为8,那么满7个字节就会返回。(造成这一结果的原因是函数要保证每次返回的字符串后面不是接 就是接 ,如果输入内容在填满缓冲区之前还没有换行符,那么函数就要把末尾的一个字节设置为 ,确保返回的字符串带 );
- 出错或者到达文件末尾(EOF);
无论何种情况,fgets一旦从缓冲区中返回,buf内容总是以 结尾的;
二、示例
编写一段这样的代码,结尾追加一个"|"字符好区分fgets返回的次数:
#include <stdio.h> #include <stdlib.h> #define BUFFSIZE 8 int main(void) { char* buff = malloc(BUFFSIZE); char* receive = NULL; while((receive = fgets(buff, BUFFSIZE, stdin)) != NULL) { printf("%s|", receive); } return 0; }
验证情况1:
输入:
123 456789
输出:
123 |456789|
可见两次返回,第一次输出123 ,第二次返回456789 ;
验证情况2:
输入:
12345678
输出:
1234567|8
|
可见两次输出,第一次由于输入填满了缓冲区n - 1 即7字节,所以输出了1234567 ,第二次输出剩下的8 ;
验证情况3:
输入:
1234567
输出:
1234567|
|
可见输入1到7的时候已经刷出了缓冲区,缓冲区总是以n-1个内容长度自动加上 返回,第n个字符是 ,它在下一次返回(下一次马上返回了,尽管只有单独一个换行符)