「暗黙的な宣言」とは、通常、関数を呼び出す前にプログラムの先頭に配置する必要があること、またはプロトタイプを宣言する必要があることを意味します。
ただし、gets
はstdio.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);
}
}
適切なヘッダーを含めると、暗黙の宣言警告が表示されないはずです。
ただし、関数gets()
はC11標準からremovedされています。つまり、_<stdio.h>
_にはgets()
のプロトタイプはもうありません。 gets()
を使用して_<stdio.h>
_になります。
gets()
を削除する理由はよく知られています:バッファオーバーランから保護することはできません。そのため、gets()
を決して使用せず、代わりに fgets()
を使用し、末尾の改行がある場合は注意してください。
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);
}
}