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