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()來輕松避免。

在本文中,我們將學習如何應用這兩個函數並進行比較。

gets()函數在C中

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