【C语言】关于scanf()与scanf_s()的一些问题

关于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出现这个问题,等之后闲下来再看吧。

发布了44 篇原创文章 · 获赞 68 · 访问量 5125

猜你喜欢

转载自blog.csdn.net/qq_25404477/article/details/102828163