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言語で定義済みの関数で、文字列やテキスト行を読み取るために使用されます。そして、入力を事前に定義された文字列変数に格納します。この関数は、改行文字に出会った時点で読み取りを終了します。

文法:

変数名で取得する。(variable name)

以下のコードは、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関数は、指定されたストリームから最大n文字までのデータを読み取り、文字列strに格納します。

  • str – It is the variable in which the string is going to be stored
  • n – It is the maximum length of the string that should be read
  • stream – It is the filehandle, from where the string is to be read.

幸いなことに、fgets()関数を使ってファイルからも標準入力からもテキスト行を読み取ることができます。さあ、どのように行うか見てみましょう。

指定されたファイルを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 Output

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

出力:

Fgets() Stdin Input

結論: 結論を下す

gets()関数とfgets()関数の両方が文字列の入力を読み取るために使用できるにも関わらず、2つの最大の違いは後者がユーザーがバッファーサイズを指定できるという点です。そのため、gets()関数よりもfgets()関数が強く推奨されます。

gets()関数には、バッファよりも大きな入力の場合の対処がないため、メモリの詰まりが発生する可能性があります。これは、fgets()関数が輝き、究極の解決策を提供する部分です。

参考文献

  • /community/tutorials/strings-in-c-programming
  • https://stackoverflow.com/questions/19748307/use-of-fgets-and-gets
コメントを残す 0

Your email address will not be published. Required fields are marked *