web-dev-qa-db-ja.com

「gets」の暗黙的な宣言

「暗黙的な宣言」とは、通常、関数を呼び出す前にプログラムの先頭に配置する必要があること、またはプロトタイプを宣言する必要があることを意味します。
ただし、getsstdio.hファイル(これを含めました)。
これを修正する方法はありますか?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char ch, file_name[25];
   FILE *fp;

   printf("Enter the name of file you wish to see\n");
   gets(file_name);
   fp = fopen(file_name,"r"); // read mode
   if( fp == NULL )
   {
      perror("Error while opening the file.\n");
      exit(EXIT_FAILURE);
   }
}
9

適切なヘッダーを含めると、暗黙の宣言警告が表示されないはずです。

ただし、関数gets()はC11標準からremovedされています。つまり、_<stdio.h>_にはgets()のプロトタイプはもうありません。 gets()を使用して_<stdio.h>_になります。

gets()を削除する理由はよく知られています:バッファオーバーランから保護することはできません。そのため、gets()を決して使用せず、代わりに fgets() を使用し、末尾の改行がある場合は注意してください。

18
P.P.

gets()はC11標準から削除されました。使用しないでください。簡単な代替手段を次に示します。

#include <stdio.h>
#include <string.h>

char buf[1024];  // or whatever size fits your needs.

if (fgets(buf, sizeof buf, stdin)) {
    buf[strcspn(buf, "\n")] = '\0';
    // handle the input as you would have from gets
} else {
    // handle end of file
}

このコードを関数でラップし、getsの代わりとして使用できます。

char *mygets(char *buf, size_t size) {
    if (buf != NULL && size > 0) {
        if (fgets(buf, size, stdin)) {
            buf[strcspn(buf, "\n")] = '\0';
            return buf;
        }
        *buf = '\0';  /* clear buffer at end of file */
    }
    return NULL;
}

そして、あなたのコードでそれを使用してください:

int main(void) {
    char file_name[25];
    FILE *fp;

    printf("Enter the name of file you wish to see\n");
    mygets(file_name, sizeof file_name);
    fp = fopen(file_name, "r"); // read mode
    if (fp == NULL) {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }
}
12
chqrlie