关于scanf()与scanf_s()的一些问题
关于scanf()的缺陷最主要就在于无法限制输入字符的数量,极其容易造成内存溢出的问题,致使程序崩溃。
接下来看这么一个例子:
环境:Visual Studio 2019
#include "stdio.h"
#include "stdlib.h"
#pragma warning(disable : 4996)
int main()
{
char* str = (char*)malloc(sizeof(char) * 11);
scanf("%s", str);
printf("%s\n", str);
return 0;
}
在正常输入的情况下是不会出现问题的,当我们键入超过10个字符时就会出现下列状况:
在此可以看到返回值已经不是0了,其实在str地址内部已经爆掉了,直接会导致程序的错误。
关于解决的办法,微软提供的是scanf_s()对其进行限制,其使用方法为:
scanf_s("%s", str, 11);
这个11使得读取字符有了限制,同时也会对str检查边界,置最后一个字节为0。需要注意的是ANSI C中没有scanf_s(),只有scanf(),它只适用于微软的Visual Studio。
使用这个函数修改后如下(同时避免了Visual Studio的C4996错误):
#include "stdio.h"
#include "stdlib.h"
int main()
{
char* str = (char*)malloc(sizeof(char) * 11);
scanf_s("%s", str, 11);
return 0;
}
执行之后可以看到返回值正常了。
注意:
中途出现了一个小问题,使用scanf_s()之后越界不能正常printf了,在之前2017还是正常的,不知道为什么2019出现这个问题,等之后闲下来再看吧。