C语言中 scanf_s和 scanf 区别是什么

2024-11-18 01:21:43
推荐回答(5个)
回答(1):

1、使用区别

scanf()不会检查输入边界,可能造成数据溢出。

scanf_s()会进行边界检查。

2、意思

scanf表示从键盘输入指定格式的数据。如:scanf("%d",x);指从键盘给x输入一个int型(整型)数据;scanf("%f",x);指从键盘给x输入一个float型(实型)数据;
对应的输出为:printf 按照指定的格式输出数据;如printf("%d",x); 指按整型数据输出X中的值。

因为带“_s”后缀的函数是为了让宴弊亩原版函数更安全,传入一个晌森和参数有关的大小值,避免引卜昌用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。

3、scanf_s()参数与scanf()不同

例如scanf(“%s”,&name,n),整形n为name类型的大小,如果name是数组,那n就是该数组的大小。

回答(2):

scanf()函数是标准C中提供的标准输入函数,用以用户输入数据

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数局贺时,必须提供一个数字以表明最多读取多少位字符。

原因和区别:

scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:

//例如:分配了5字节的空亮岁间但是用户输入了10字节,就会导致scanf()读到10个字节
char buf[5]={'\0'};
scanf("%s", buf);
//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。

以上代码如果用scanf_s()则可避免此问题:

char buf[5]={'\0'};
scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0' 
//如果输入1234567890,则buf只会接受前4个字符

注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.

PS: 很多带“_s”后缀的函数是为了让原版函桐键派数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。

回答(3):

scanf表示从键盘输入指定格式的数据。如:scanf("%d",x);指从键盘给x输入一个int型(整型)数据;scanf("%f",x);指从键盘给x输入一个float型(实型)数据;
对友正应的输出为:printf 按照指定的格式输出数据;如printf("%d",x); 指按整型数据输出X中的值。

举例说明如下:

scanf("%d%d", &a, &b); // 接收用户从键好数悔盘毕升输入的2个整数,分别赋值给变量a,b

回答(4):

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++2005/2008中提供了搏雀枯scanf_s(),在调用时,岁腊必须提供一个数字以表明最多读取多基洞少位字符。

回答(5):

二者的区别与 strcpy 和 strncpy 的区别一样
scanf_s提供更兆禅樱安全一些的袭芹机制 ,以防止溢出 ,对于 %s , %S 等 ,变量地址后要紧族丛跟一个参数,以表示其大小,如:
wchar_t ws[10];

scanf_s("%S", ws, 10);