fgets()学习

fgets函数原型:char *fgets(char *s, int n, FILE *stream);
//我们平时可以这么使用:fgets(str, sizeof(str), stdin);
其中str为数组首地址,sizeof(str)为数组大小,stdin表示我们从键盘输入数据。

读取sizeof(srt) - 1 个字符 存到 str 中 ,返回值为字符串str
遇到换行符结束

两种情况:

1,输入字符长度小于 sizeof(srt) - 1, 系统会在末尾加上 ,然后在 加个结束符

返回字符串长度包含 ,比输入的多1.

从文件或标准输入接收一串字符,遇到' '时结束,把' '也作为一个字符接收

2, 输入字符长度大于等于 sizeof(srt) - 1, 系统在末尾加上;

返回字符串长度为sizeof(srt) - 1

代码示例:

#include <stdio.h> #include <string.h> #define N 10 int main() {
  //数组空间10.
char s1[N]; fgets(s1, N, stdin); cout << "s1所占空间大小为:"; cout << sizeof(s1) << endl; cout <<"s1 为:"; cout << s1; if(s1[3] == ' ') { // 去掉换行符 cout << "有换行符"<<endl; } if (s1[4] == '') { cout << "自动加了结束符"<<endl; } cout << " s1长度:"; cout << strlen(s1) <<endl; return 0
; }

第一种情况


第二种情况

 附:转载: gets和fgets,scanf  区别

gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

①gets——从标准输入接收一串字符,遇到' '时结束,但不接收' ',把 ' '留存输入缓冲区;把接收的一串字符存储在形式参数指针指向的空间,并在最后自动添加一个''。 

注意:gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用fgets()来替换gets()(在linux下,程序中用gets(),编译会有warning: the `gets' function is dangerous and should not be used)。

scanf("%s",&s)与gets(s)函数相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

原文地址:https://www.cnblogs.com/strivingforever/p/8882402.html