隐式声明“获取”

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

Solutions Collecting From Web of "隐式声明“获取”"

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

但是,函数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")] = '\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); } }