我才刚刚开始编程之旅。我在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]
答案 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 correctly。 gets
不知道它可以在数组中写入多少个字符,并继续写入用户提供的字符数,这导致程序具有未定义的行为-崩溃,不相关的修改数据等。
解决方法是改用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);
}