给c语言刚入门的
1、请刚开始学习c语言的同学尽量少用或者干脆不适用scanf函数,实际项目很少用到,而且很容易出错。
2、使用fgets(buf,max,stdin),或者fread(buf,max.stdin)好的多。
[解决办法]
闲聊下吧:
先说LZ的例子
char buf[max] = {0};
int a = 0;
fgets(buf, max - 1, stdin);
a = atoi(buf);
如果仔细读过手册什么的,应该是
fgets(buf, max, stdin);
The fgets() function reads at most one less than the number of characters
specified by n from the given stream and stores them in the string s.
其实就像lin5161678所说的,scanf也可以做限制,以防止缓冲溢出(LZ强调的)即
char buf[5] = "";
scanf("%4s", buf);
好了,LZ又说4不能以参数的形式传入,其实是可以的(如果读过printf的手册),即
int max = 5;
char format[BUFSIZ] = "";
printf("%%%ds", max - 1);
scanf(format, buf);
然后,LZ也许会说,这不多了一道手续么?
好吧,看LZ的例子,不是也多了一步atoi
其实上面的都不是重点,重点就是,读手册,真正理解它在做什么,怎么做的。
上面三段代码,其实涉及到三个常用的API,即fgets,printf,scanf,可惜的是,很多初学者连知其然的程度都还没有达到。
另一方面,LZ的想法还是很好的,即防止缓冲溢出。
但是,实际的工程中,总是有边界的,边界内,输入还是可信的;边界外,需要格外注意安全。
个人最想说的是,“知其然知其所以然”,不要“因噎废食”。
[解决办法]
scanf会有可能导致栈溢出
因为在scanf函数读入数据时,如果输入的数据过长,会覆盖掉栈里面其他变量的内容。
把栈中函数返回地址改了,改向一个shellcode是很危险的
好像VS现在会提出警告吧用scanf