鱼C论坛

 找回密码
 立即注册
查看: 4137|回复: 9

scanf和scanf_s的区别

[复制链接]
发表于 2011-10-27 10:53:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 solomon_gao 于 2011-10-27 19:35 编辑

测试环境:Windows 7 旗舰版(7600)
测试软件:VS 2010 SP1旗舰版

如果这个环境中使用scanf,会提示如下:

1>c:\users\administrator\documents\visual studio 2010\projects\open\open\open.cpp(7): warning 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.
1>          c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(304) : 参见“scanf”的声明

谁能告诉下,这俩函数的区别呢?






#include <stdio.h>
int main (void)
{
char zm,a;
printf("请输入一个字母:");
scanf_s("%c",&zm,1);
if ( zm >= 65 && zm <= 90)
{
a = zm +32;
printf("您输入的是大写字母,现在给你转换出小写字母%c",a);
}
else
{
printf("您输入的小写字母,无需转换。它是%c",zm);
}
}


这样就可以正常执行。另外我想问下scanf_s("%c",&zm,1);中的1代表什么意思。如果改成其他数字,有什么影响呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-27 14:34:56 | 显示全部楼层
scanf_s没有这个函数吧?我知道的和我在msdn里查找都没……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-27 18:06:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-27 18:12:25 | 显示全部楼层
本帖最后由 yipwing 于 2011-10-27 18:16 编辑

解释在这里,msdn上有说
In the case of characters, one may read a single character as follows:
char c;
scanf("%c", &c, 1);
When reading multiple characters for non-null terminated strings, integers are used as the width specification and the buffer size.
char c[4];
scanf("%4c", &c, 4); // not null terminated
也就是说windows CRT的问题 scanf_s最后一个参数的意义,就是说让读取字符串最大读取多少个,明白了吗?

PS:  这个只是本人的基本认识,如有错误,欢迎指正...谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-27 18:31:37 | 显示全部楼层
yipwing 发表于 2011-10-27 18:12
解释在这里,msdn上有说
In the case of characters, one may read a single character as follows:
char  ...

但是我测试以后,如果改成2、3、4、5都只能输入一个字母。没啥区别啊= = !
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-27 18:36:54 | 显示全部楼层
solomon_gao 发表于 2011-10-27 18:31
但是我测试以后,如果改成2、3、4、5都只能输入一个字母。没啥区别啊= = !

输入多也一样啊..
因为有边界问题..scanf不检测边界,scanf_s检测边界..明白了么?

还是那句话: 这只是个人理解,如有错误欢迎指正...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-27 18:57:22 | 显示全部楼层
yipwing 发表于 2011-10-27 18:36
输入多也一样啊..
因为有边界问题..scanf不检测边界,scanf_s检测边界..明白了么?

没明白。你说的检测边界是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-27 19:06:22 | 显示全部楼层
本帖最后由 yipwing 于 2011-10-27 19:11 编辑
solomon_gao 发表于 2011-10-27 18:57
没明白。你说的检测边界是什么意思?

比如说,你的是字符串,如果字符串越界了,你说会怎样?

每个字符串,每个你分配的内存,都有个边界,对不?  如果超出了边界,就容易被其他程序发现漏洞,并利用这个漏洞来获得程序的某些...神马神马..  你应该明白...(我想)
当然,这个是windows CRT ...  不知道Linux 之类的有没这个问题..

还是那句话: 个人理解,有错,欢迎指正..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-27 19:35:35 | 显示全部楼层
yipwing 发表于 2011-10-27 19:06
比如说,你的是字符串,如果字符串越界了,你说会怎样?

每个字符串,每个你分配的内存,都有个边界,对不?   ...

啊。懂了  谢谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-27 19:44:44 | 显示全部楼层
solomon_gao 发表于 2011-10-27 19:35
啊。懂了  谢谢了!

u are welcome...!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表