异常说明: 今天在编程时遇到一个小错误就是用scanf_s输入字符串时程序出现异常0xFEFEFEFE 处有未经处理的异常(在 查找学生信息.exe 中): 0xC00001A5: 检测到无效的异常处理程序例程。 (参数: 0x00000003)。如下图所示:
解决方法:
首先了解scanf_s() 和scanf()的区别。教材里用的scanf(),其实在目前Visual Studio版本中已经弃用了,用scanf_s()函数代替了.
scanf() 函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。其调用格式为:scanf("<格式化字符串>",<地址表>)。
scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存泄露”这个问题设计的。scanf_s()用于读取字符串时,必须提供一个数字以表明最多读取多少位字符,以防止溢出。
下面用一个简单案例说明:
(1)出现异常的程序如图:
(2)消除异常的两种方法
①在程序开始时加入一句宏定义:#define _CRT_SECURE_NO_WARNINGS 。 然后将scanf_s改为scanf且printf_s 改为printf。如下图所示,
②在scanf_s中给字符串变量后加上原有长度。例如本例中将scanf_s("%s",name)改为scanf_s("%s",name,10) 。程序 如下图所示,
Tips:scanf函数或scanf_s函数中输入项如果受字符数组名,不再加地址符&,因为在c语言中数组名代表该数组的起始地址。