【C语言:精准打击】scanf_s()函数与scanf()函数的相关解决方案

国际标准ANSI C中没有scanf_s()函数,只有scanf()函数,scanf()函数在读取时不检查边界,所以可能会造成内存泄露。故VC++2005/2008中提供了scanf_s()函数,在调用时,必须提供一个数字n以表明最多读取多少位字符。

1. scanf()函数

scanf()函数是库stdio.h中的一个函数,scanf ()函数功能是“通过外界键盘给源代码中的变量赋值”。该函数有两种用法,分别是:

① scanf(“输入控制符”, 输入参数);

功能:将从外界键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int sum = 0;
	scanf("%d%d", &a, &b);//%d%d应该连续挨着且中间无其他符号
	sum = a + b;
	printf("sum = %d",sum);
	return 0;
}
常用输入控制符
% d 十进制有符号整数
% u 十进制无符号整数
% f 浮点数
% s 字符串
% c 单个字符
% p 指针的值
% e 指数形式的浮点数
% x 无符号以十六进制表示的整数
% 0 无符号以八进制表示的整数
% g 自动选择合适的表示

② scanf(“非输入控制符+输入控制符”, 输入参数);

不推荐这种用法,因为scanf()函数和printf()函数在这种情况下不一样,scanf()函数需要把双引号""的内容完整输入才能使用此函数②功能,故也不推荐使用\n在scanf()函数中。
注意:在使用scanf ()函数功能①中,虽然没有加任何“非输入控制符”,但是从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分是给不同变量赋的值。而且空格、回车或 Tab 键的数量不限,只要有就行。一般都使用一个空格。此外强调一点:当用 scanf()函数给多个变量赋值时,scanf 中双引号内多个“输入控制符”之间千万不要加逗号。

scanf("num=%d%,d"\n, &a, &b);//错误示范

2. scanf_s()函数

对于使用visual studio的使用者,大概率会出现scanf()函数报错,进而解决方案中推荐使用scanf_s()函数。scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。

① scanf_s(“输入控制符”, 输入参数,n);

前面与scanf()函数一致,唯一不同就是scanf_s()函数最后一个参数n是接收缓冲区的大小(即输入参数的内存容量),表示最多读取n-1个字符。

3. 对于VS中报错的解决方案

①scanf()函数替换为scanf_s()函数

该方案适用于为了使内存不泄露,更加细节地控制内存使用。

②源代码第一行加上#define _CRT_SECURE_NO_WARNINGS 1

该方案使用初学者更好的学习scanf()函数,以免出现scanf_s()函数因内存误差而导致内存不足,进而报错。

#define _CRT_SECURE_NO_WARNINGS 1

//内存不足报错示例
0x00007FFA515FFE49 (ucrtbased.dll)(位于 Project_C.exe 中)引发的异常: 0xC0000005: 写入位置 0x000000BC80100
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&玖月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值