C语言中的fgets()和gets()

介绍

我们都熟悉scanf()函数。这是一个主要用于接收基本用户输入的函数。尽管scanf()在接收诸如整数、字符、浮点数等输入时效果很好。但是,在接收包含空格的字符串输入时,它确实表现不佳。让我们看一个例子,

#include<stdio.h>
int main()
{
    char string[10];
    printf("Enter the string: ");
    scanf("%s", string);
    printf("\n %s",string);
    return 0;
}

输出:

Problem With scanf()

正如我们从上面的例子中观察到的那样,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;
}

输出:

Use Of Gets

将输出与使用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!’。在这种情况下,上述代码的输出将是:

fgets() file input

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;
}

输出:

fgets() Stdin Input

结论

尽管gets()fgets()这两个函数都可以用于读取字符串输入,但两者之间最大的区别在于后者允许用户指定缓冲区大小。因此,它比gets()函数更受推荐。

gets()函数没有考虑输入大于缓冲区的情况。因此可能会发生内存拥塞。这就是fgets()函数出色的地方,提供了一个终极解决方案。

参考资料

Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming