隐含声明'获取'

时间:2015-12-01 22:35:16

标签: c linux gets

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

2 个答案:

答案 0 :(得分:17)

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

但是,函数gets()已从C11标准删除。这意味着gets()中的<stdio.h>不再是原型。 gets() 过去位于<stdio.h>

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

答案 1 :(得分:12)

using (var db = new myDatabase()) { var itemLists = db.GetAllItem().ToList(); var userSubmittedItems = db.GetAllUserItem("LoginID").ToList(); if (userSubmittedItems.Count > 0) { foreach (var submittedItems in userSubmittedItems) { foreach (var item in itemLists) { int itemID = item.ItemID; int userItemID = userSubmittedItems.UserItemID; if (itemID == userItemID && item.OneTime == true) { itemLists.Remove(item); db.ItemEntity.Remove(item); // mark for delete } } } db.SaveChanges(); // all marked items, if any, will now // be committed in a db call } 已从C11标准中删除。不要使用它。 这是一个简单的替代方案:

gets()

您可以将此代码包装在函数中,并将其用作#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;
}