scanf_s

很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时hacker可以利用原版的不安全性黑掉系统

例如:

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节

  1. char buf[5]={‘\0‘};
  2. scanf("%s", buf);

    如果输入1234567890,后面的部分会被写到别的空间上去。

    以上代码如果用scanf_s,第二行应改为scanf_s("%s",buf,5),表示最多读取4个字符,因为buf[4]要放‘\0‘

scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符.

vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。

时间: 2024-10-12 10:01:36

scanf_s的相关文章

C语言杂谈(一)scanf()、scanf_s()与错误 C4996

错误 C4996 初学C语言时,第一个接触到的I/O函数便是scanf()了.但在高版本的 Visual Studio (包括但不限于2015.2013.2012)编译代码时,却会出现意想不到的错误.有如下一段简单的代码: #include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf("%d", &i); printf("i is %d",

scanf() scanf_s() 区别

写博愿意:这几天由于小学期的缘故,接触到了好多C代码,在VS2013中编译的时候,遇到了如下问题: 错误 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\revenge\d

scanf 和 scanf_s

scanf 和 scanf_s scanf()函数是标准C中提供的标准输入函数,用以用户输入数据 scanf_s()函数是Microsoft公司Visual Studio开发工具提供的一个与scanf()功能相同的安全标准输入函数 从vc++2005开始,VS系统提供了scanf_s().在调用该函数时,必须提供一个数字以表明最多读取多少位字符. 原因和区别 scanf()在读取数据时不检查边界,所以可能会造成内存访问越界: 例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()

scanf和scanf_s在VS2013中的使用

scanf和scanf_s在VS2013中的使用 在VS2013中,每次使用scanf都会报错:This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 给了两种解决办法,要不就是用scanf_s,要不就用_CRT_SECURE_NO_WARNIN

SCANF SCANF_S

今天在看C的教程的时候,用VS2013写了一小段代码 scanf("%f",&w); 提示需要在预编译器里添加 _CRT_SECURE_NO_WARNINGS,  百度了下,发现要么用 scanf_s 来代替scanf,要么就添加这个定义 原因是,VS针对scanf的不安全性,又包了一个scanf_s的函数 ,定义里,多了一个长度的参数, scanf_s("%s",buf,sizeof(buf)); 这样不会导致内存溢出错误(比如只能接受4个长度的数组,输入

关于while(scanf_s("%d",&x)!=0) 的逻辑错误 (scanf_s的 返回值)

背景:1.要求输入多组数据,然后输出什么东西,当第一个数输入的是0是,程序停止. 2.前几天学过 while(scanf_s("%d",&x)!=EOF) ctrl+z时停止 所以我想可以把EOF换成0,这样输 入0是就可以停止,但是事实证明我错了. 知识储备:scanf_s的返回值 : scanf("%d %d",&a,&b); 函数返回值为int型.如果a和b都被成功读入,那么scanf的返回值就是2: 如果只有a被成功读入,返回值为1:

2019/12/7 vs studio 中scanf_s()问题

代码:sum = sum_oil(num_oil, kind_oil, kind_sev); 问题:“scanf_s”: 没有为格式字符串传递足够的参数 参考解决方案:(1)微软官网查询https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=vs-2019   (2)  scanf_s()对字符比较严格,需要知道输入字符所占空间的大小,所

素数应用

输入一个数 分解尾三个数想乘 如果三个数其中有两个为素数->yes 否则no 1 //素数升级 2 //功能:??已知N是正整数,?它可拆写成三个正整数N1.N2和N3之和的形式N=N1+N2+N3.? 3 //请编程序打印出满足上式的全部组合,并当N1.N2和N3中至少有两个是素数时打印"YES"否则打印"NO".? 4 //如N = 5时输出:? 5 //5 = 1 + 1 + 3?????NO? 6 //5 = 1 + 2 + 2?????YES? 7

VS2015使用scanf报错的解决方案

1.在程序最前面加: #define _CRT_SECURE_NO_DEPRECATE 2.在程序最前面加: #pragma warning(disable:4996) 3.把scanf改为scanf_s: 4.无需在程序最前面加那行代码,只需在新建项目时取消勾选"SDL检查"即可: 5.若项目已建立好,在项目属性里关闭SDL也行:我用的VS是中文版的 (1).我将"是"改为"否",编译同样的代码时出现了如下的警告,不是报错: (2).如果不改,