别提什么『缓冲区』,这不是C/C++的概念
gets的原型是 char *gets( char *buffer ); 它没有指定buffer的长度,因此程序员必须保证buffer足够装得下需要读取的行。
换句话说,当你使用gets时,就等于向编译器保证了buffer一定足够,
因此buffer中是不需要容纳'\n'的。
现实中,程序员无法保证buffer一定足够容纳下需要读取的行(甚至包括故意的数组溢出攻击),
因此gets这个函数已经被C/C++语言废弃了。
fgets的原型是 char *fgets( char *buffer, int n, FILE *stream ); 它指定了buffer长度,但程序员如何区分是读完整了一行而结束,还是读满了buffer而结束?
因此buffer中可能会包含'\n',因读满buffer而结束时buffer中无'\n',因读完了行而结束时buffer中带'\n',以作区分。最后一行例外,因为最后一行自有feof来判断,若最后一行无回车,是不会故意添加'\n'的。