我想阅读用户使用C程序输入的名称.
为此,我写道:
char name[20];
printf("Enter name: ");
gets(name);
Run Code Online (Sandbox Code Playgroud)
但是使用gets不好,那么更好的方法是什么?
来自man gets:
永远不要使用gets().因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请改用fgets().
几乎无处不在我看到scanf的应该有同样的问题(一个方式使用缓冲区溢出/缓冲区溢出)scanf("%s",string).这种情况存在这个问题吗?为什么scanf手册页中没有关于它的引用?为什么gcc在编译时不会发出警告-Wall?
ps:我知道有一种方法可以在格式字符串中指定字符串的最大长度scanf:
char str[10];
scanf("%9s",str);
Run Code Online (Sandbox Code Playgroud)
编辑:我不是要求确定前面的代码是否正确.我的问题是:如果scanf("%s",string)总是错的,为什么没有警告,手册页中没有任何关于它的内容?