'gets' 的隐式声明

Implicit declaration of 'gets'

我理解'implicit declaration'通常意味着函数在调用之前必须放在程序的顶部或者我需要声明原型。
但是,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);
   }
}

你是对的,如果你包含正确的 headers,你不应该得到隐式声明警告。

但是,函数 gets() 已从 C11 标准中删除。这意味着 <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")] = '[=10=]';
    // 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")] = '[=11=]';
            return buf;
        }
        *buf = '[=11=]';  /* 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);
    }
}