鱼C论坛

 找回密码
 立即注册
查看: 2569|回复: 17

vs2013的问题(scanf和一个只可以看图的问题)

[复制链接]
发表于 2014-8-22 22:54:13 | 显示全部楼层 |阅读模式

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

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

x
昨天刚下了vs2013,各种不适应,之前用2010还好好的,2013有各种问题,一晚上遇到两个,第一个是scanf是不能用了么,bing上说是因为微软觉得scanf不安全倡导大家用scanf_s,不知道是不是这样的。第二,上图,我已经完全不知道错在哪里了,已晕
屏幕快照 2014-08-22 下午10.38.53.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-22 23:12:15 | 显示全部楼层
试试把%c,%c中间的","去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-22 23:13:52 | 显示全部楼层
calton007 发表于 2014-8-22 23:12
试试把%c,%c中间的","去掉

也不行,换成空格也不行。。是不是该砸电脑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-22 23:16:16 | 显示全部楼层
calton007 发表于 2014-8-22 23:12
试试把%c,%c中间的","去掉

异常代码:        c0000005
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-22 23:18:14 | 显示全部楼层
Jack_McKing 发表于 2014-8-22 23:13
也不行,换成空格也不行。。是不是该砸电脑了

有没有可能是printf里面的\n的问题,试试去掉
抱歉,我电脑刚重装,没有装vs2013,不能调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-22 23:20:16 | 显示全部楼层
calton007 发表于 2014-8-22 23:18
有没有可能是printf里面的\n的问题,试试去掉
抱歉,我电脑刚重装,没有装vs2013,不能调试

好感谢你啊。。但是还是不行。不是这个的问题吧。。。调试也没说有错阿,也没有报错提示,我还没有见过系统出现的这种错误提示,好吓人阿,就和死机一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-23 10:09:18 | 显示全部楼层
....
scanf_s("%c,%c",&a,1,&b,1);

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 10:44:23 | 显示全部楼层
elvo 发表于 2014-8-23 10:09
....
scanf_s("%c,%c",&a,1,&b,1);

啥意思啊那个1是,能解释一下么。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 10:45:48 | 显示全部楼层
elvo 发表于 2014-8-23 10:09
....
scanf_s("%c,%c",&a,1,&b,1);

确实成功了。。但是这是为什么呢。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 12:25:03 | 显示全部楼层
elvo 发表于 2014-8-23 10:09
....
scanf_s("%c,%c",&a,1,&b,1);

同样的问题,这回加1加1.0都试了都没用。。所以我还是不明白所以然
屏幕快照 2014-08-23 下午12.24.23.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-23 12:57:59 | 显示全部楼层
Jack_McKing 发表于 2014-8-23 12:25
同样的问题,这回加1加1.0都试了都没用。。所以我还是不明白所以然

你是一直都没有弄清楚scanf_s的用法,我可以点击下面这个地址去看看
http://msdn.microsoft.com/zh-cn/library/w40768et%28VS.80%29.aspx
里面有一句说得很明白了:Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or [. The buffer size is passed as an additional parameter immediately following the pointer to the buffer or variable.
你给出的%lf又不在哪几个类型之中,就不需要指明buffer size了。你可以试一试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 14:34:22 | 显示全部楼层
elvo 发表于 2014-8-23 12:57
你是一直都没有弄清楚scanf_s的用法,我可以点击下面这个地址去看看
http://msdn.microsoft.com/zh-cn/l ...

可是我又打开又试了一遍就行了,这是为什么啊,,你能不能尽量用中文解释一下。。
屏幕快照 2014-08-23 下午2.34.32.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-23 14:42:13 | 显示全部楼层
scanf_s当使用c, C, s, S, or [这几个参数类型的时候就要加一个大小值,其他不同。例如
scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,&wc, 1, s, 80, ws, 80 );
i,fp是%d,%f所以它们后面不加大小,c,wc,s,ws的分别参数类型%c,%C,%s,%S它们就要加大小值,这个也就体现了它不scanf安全的地方,都限定了边界,不让发生溢出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 15:01:09 | 显示全部楼层
elvo 发表于 2014-8-23 14:42
scanf_s当使用c, C, s, S, or [这几个参数类型的时候就要加一个大小值,其他不同。例如
scanf_s( "%d %f % ...

这个大小值是不是得背啊。。大小值都是有规定的值?
我找到了一个解决方案#pragma warning(disable:4996)
#define _CRT_SECURE_NO_DEPRECATE
这两个貌似可以继续使用scanf,不过既然不安全我也想搞清楚scanf_s安全在哪好去用
太感谢你了,你讲的非常清楚。。是我级别太低听的一知半解,我明白了它因为数据容易益处所以不安全,但是那个大小值是固定的还是什么我还是不太明白。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-23 15:13:07 | 显示全部楼层
Jack_McKing 发表于 2014-8-23 15:01
这个大小值是不是得背啊。。大小值都是有规定的值?
我找到了一个解决方案#pragma warning(disable:4996 ...
#include <stdio.h>

int main( void )
{
   int      i,
            result;
   float    fp;
   char     c,
            s[81];
   wchar_t  wc,
            ws[81];

   result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                     &wc, 1, s, 80, ws, 80 );
   printf( "The number of fields input is %d\n", result );
   printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
           wc, s, ws);
   result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                      &wc, 1, s, 80, ws, 80 );
   wprintf( L"The number of fields input is %d\n", result );
   wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
            c, wc, s, ws);
}

这是我之前给你那个网址上的程序,你把它看懂就学会scanf_s了,那个大小值buffer size不是靠背的或是猜的。。。至于完全,你有兴趣的话可以去看一看溢出方面的书,自己写一个shellcode
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 18:29:22 | 显示全部楼层
elvo 发表于 2014-8-23 15:13
这是我之前给你那个网址上的程序,你把它看懂就学会scanf_s了,那个大小值buffer size不是靠背的或是 ...

就是没大看懂才请求你给点通俗易懂的解释。。那个大小值到底是多少我还是不太明白怎样规定的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-26 12:48:43 | 显示全部楼层
本帖最后由 cheny3636 于 2014-8-26 12:57 编辑

1应该是代表指定scanf_s输入长度,  用VS2013可以在建立项目的时候不勾选安全开发生命周期就可以用scanf了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-27 19:44:26 | 显示全部楼层
cheny3636 发表于 2014-8-26 12:48
1应该是代表指定scanf_s输入长度,  用VS2013可以在建立项目的时候不勾选安全开发生命周期就可以用scanf了

那输入长度是如何规定的呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 21:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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