当前位置:  开发笔记 > 编程语言 > 正文

"获取"的隐含声明

如何解决《"获取"的隐含声明》经验,为你挑选了2个好方法。

我理解"隐式声明"通常意味着在调用函数之前必须将函数置于程序的顶部,或者我需要声明原型.
但是,gets应该在stdio.h文件中(我已经包含在内).
有没有什么办法解决这一问题?

#include 
#include 

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

P.P... 18

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

然而,该功能gets()已被删除,从C11的标准.这意味着不再有一个原型gets().gets() 曾经.

删除的原因gets()是众所周知的:它无法防止缓冲区溢出.因此,您应该永远不要使用gets()和使用fgets()并处理尾随换行符(如果有的话).



1> P.P...:

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

然而,该功能gets()已被删除,从C11的标准.这意味着不再有一个原型gets().gets() 曾经.

删除的原因gets()是众所周知的:它无法防止缓冲区溢出.因此,您应该永远不要使用gets()和使用fgets()并处理尾随换行符(如果有的话).



2> chqrlie..:

gets()从C11标准中删除.不要使用它.这是一个简单的替代方案:

#include 
#include 

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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有