国际标准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