警告:函数“ gets”的隐式声明;你是说“ fgets”吗? [-Wimplicit函数声明]

时间:2019-12-07 14:35:10

标签: c

我才刚刚开始编程之旅。我在Ubuntu终端中编写代码。在编译使用gets()函数的程序时遇到问题。

#include<stdio.h>

/*example of multi char i/p function*/
void main()
{
    char loki[10];
    gets(loki);
    printf("puts(loki)");
}

我得到的错误是:

warning: 'implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]

2 个答案:

答案 0 :(得分:5)

在Ubuntu上,在终端上运行man gets。它应该显示this gets(3)手册页。

该文档以英文书写:

  

请勿使用此功能。

更一般地,在编程之前,请阅读文档。对于Linux上的C,请考虑阅读the man pages,此C reference,许多C编程tutorials和C11标准n1570

英语维基百科也mentions gets

最后

  

警告:“隐式声明函数“ gets”;你是说“ fgets”吗? [-Wimplicit-function-declaration]

我用英语写的似乎很清楚。根据经验,请确保程序在没有警告的情况下进行编译。另请参阅How to debug small programs

您可能会对理解首字母缩略词RTFM and STFW感兴趣。

从第1节到第9节,我通过阅读SunOS3手册页(当时在纸上,在工作中,由当时我有幸使用的Sun3 / 160工作站出售)学习了C和Unix编程。

您可以在手册页之前阅读Advanced Linux Programming


  

我才刚刚开始编程之旅。

然后,我建议阅读SICP。在我祖父的眼中,即使在2019年,它仍然是编程的最佳入门。另请参阅these hints。 SICP是否使用某种在专业现实生活中使用不多的编程语言(请参阅Guile)并不重要:编程是关于概念的,而不是关于编码的。您将在SICP中学习的概念必将帮助您以后编写更好的C代码。当然,请阅读http://norvig.com/21-days.html


NB。我是法国人(出生于1959年),所以不会说英语。但是我被教导要阅读,包括在我的博士学习期间,当然还有在高中和我自己的父母阅读。当我在大学教授一些CS知识时,我告诉学生的第一件事是 read 。永远不要以阅读为耻。

答案 1 :(得分:3)

gets已在C11中删除,因为它是impossible to use correctlygets不知道它可以在数组中写入多少个字符,并继续写入用户提供的字符数,这导致程序具有未定义的行为-崩溃,不相关的修改数据等。

解决方法是改用fgets,尽管要记住它在缓冲区中保留了换行符:

#include <stdio.h>

// example of multi char i/p function
int main(void)
{
    char loki[10];
    fgets(loki, 10, stdin);

    // now loki will have the new line as the last character
    // if less than 9 characters were on the line

    // we can remove the extra with `strcspn`:
    loki[strcspn(loki, "\n")] = 0;

    // this will print the given string followed by an extra newline.
    puts(loki);
}