導入
私たちはみな、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() を使用して標準入力から読み取ります
#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()
は文字列入力の読み取りに使用できます。しかし、2つの間で最大の違いは、後者がユーザーがバッファサイズを指定できることです。したがって、gets()
関数よりも高く推奨されています。
gets()
関数は、入力がバッファよりも大きい場合のケースのための規定がありません。その結果、メモリの過剰な使用が発生する可能性があります。これが fgets()
関数が光り輝き、究極の解決策を提供する部分です。
参考文献
Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming