介绍
我们都熟悉scanf()
函数。这是一个主要用于接收基本用户输入的函数。尽管scanf()
在接收诸如整数、字符、浮点数等输入时效果很好。但是,在接收包含空格的字符串输入时,它确实表现不佳。让我们看一个例子,
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the string: ");
scanf("%s", string);
printf("\n %s",string);
return 0;
}
输出:

正如我们从上面的例子中观察到的那样,scanf()
在遇到空格或换行符时就停止扫描。实际上,这使得使用scanf()
接收字符串输入变得有点麻烦。这可以通过使用其他输入函数,如gets()
和fgets()
来轻松避免。
在本文中,我们将学习如何应用这两个函数并将它们进行比较。
C语言中的gets()函数
gets()
是C语言中的一个预定义函数,用于读取字符串或文本行,并将输入存储在一个预定义的字符串变量中。该函数在遇到换行符时终止其读取过程。
语法:
gets(变量名);
给定的代码如下所示,演示了gets()
函数的使用。
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the String: ");
gets(string);
printf("\n%s",string);
return 0;
}
输出:

将输出与使用scanf()
时的输出进行比较。 ‘Hello World’现在被视为一个单个字符串。
C中的fgets()函数
标准C库还为我们提供了另一个函数,即fgets()
函数。该函数从指定的文件或控制台读取文本行或字符串。然后将其存储到相应的字符串变量中。
类似于gets()
函数,fgets也在遇到换行字符时终止读取。但是,与gets()
不同的是,该函数在达到EOF时或者字符串长度超过指定限制n-1时也会停止读取。
语法:
fgets(char *str, int n, FILE *stream)
- str – 要存储字符串的变量
- n – It is the maximum length of the string that should be read
- stream – 文件句柄,从中读取字符串。
幸运的是,我们可以通过使用fgets()
函数从文件或标准输入流中读取文本行。让我们看看如何。
1. 使用fgets()从给定文件读取
例如,
#include<stdio.h>
int main()
{
char string[20];
FILE *fp;
fp=fopen("file.txt","r");
fgets(string,20,fp);
printf("The string is: %s",string);
fclose(fp);
return 0;
}
考虑file.txt包含行‘JournalDev fgets() example!’。在这种情况下,上述代码的输出将是:

2. 使用fgets()从stdin读取
#include<stdio.h>
int main()
{
char string[20];
printf("Enter the string: ");
fgets(string,20,stdin); #input from stdin stream
printf("\nThe string is: %s",string);
return 0;
}
输出:

结论
尽管gets()
和fgets()
这两个函数都可以用于读取字符串输入,但两者之间最大的区别在于后者允许用户指定缓冲区大小。因此,它比gets()
函数更受推荐。
gets()
函数没有考虑输入大于缓冲区的情况。因此可能会发生内存拥塞。这就是fgets()
函数出色的地方,提供了一个终极解决方案。
参考资料
Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming