介紹
我們都熟悉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()
來輕松避免。
在本文中,我們將學習如何應用這兩個函數並進行比較。
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;
}
輸出:

將輸出與使用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