来自man gets
:
永远不要使用gets()。因为不知道在事先不知道数据的情况下,gets()将读取多少字符,而且由于gets()将继续存储超出缓冲区末尾的字符,因此使用它非常危险。它已被用于破坏计算机安全。请改用fgets()。
几乎到处都可以看到scanf
以应该存在同样问题的方式使用:scanf("%s",string)
。(缓冲区溢出/越界)这种问题在这种情况下存在吗?为什么scanf
手册中没有相关引用?为什么gcc在使用-Wall
编译时不发出警告?
附注:我知道有一种方法可以在格式字符串中指定字符串的最大长度:scanf
:
char str[10];
scanf("%9s",str);
编辑:我不是在问前面的代码是否正确。我的问题是:如果scanf("%s",string)
总是错误的,为什么没有警告,并且手册中也没有任何关于它的内容?
scanf
是不安全的。 - aviraldgscanf("%s",...)
是不安全的。这里有一个关于此问题的参考链接:http://c-faq.com/stdio/scanfprobs.html。我仍然不明白为什么手册中没有任何关于这个问题的说明。 - dbarbosa