Jack_McKing 发表于 2014-8-22 22:54:13

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

昨天刚下了vs2013,各种不适应,之前用2010还好好的,2013有各种问题,一晚上遇到两个,第一个是scanf是不能用了么,bing上说是因为微软觉得scanf不安全倡导大家用scanf_s,不知道是不是这样的。第二,上图,我已经完全不知道错在哪里了,已晕

calton007 发表于 2014-8-22 23:12:15

试试把%c,%c中间的","去掉

Jack_McKing 发表于 2014-8-22 23:13:52

calton007 发表于 2014-8-22 23:12
试试把%c,%c中间的","去掉

也不行,换成空格也不行。。是不是该砸电脑了

Jack_McKing 发表于 2014-8-22 23:16:16

calton007 发表于 2014-8-22 23:12
试试把%c,%c中间的","去掉

异常代码:        c0000005

calton007 发表于 2014-8-22 23:18:14

Jack_McKing 发表于 2014-8-22 23:13
也不行,换成空格也不行。。是不是该砸电脑了

有没有可能是printf里面的\n的问题,试试去掉
抱歉,我电脑刚重装,没有装vs2013,不能调试

Jack_McKing 发表于 2014-8-22 23:20:16

calton007 发表于 2014-8-22 23:18
有没有可能是printf里面的\n的问题,试试去掉
抱歉,我电脑刚重装,没有装vs2013,不能调试

好感谢你啊。。但是还是不行。不是这个的问题吧。。。调试也没说有错阿,也没有报错提示,我还没有见过系统出现的这种错误提示,好吓人阿,就和死机一样。

elvo 发表于 2014-8-23 10:09:18

....
scanf_s("%c,%c",&a,1,&b,1);

Jack_McKing 发表于 2014-8-23 10:44:23

elvo 发表于 2014-8-23 10:09
....
scanf_s("%c,%c",&a,1,&b,1);

啥意思啊那个1是,能解释一下么。。

Jack_McKing 发表于 2014-8-23 10:45:48

elvo 发表于 2014-8-23 10:09
....
scanf_s("%c,%c",&a,1,&b,1);

确实成功了。。但是这是为什么呢。。

Jack_McKing 发表于 2014-8-23 12:25:03

elvo 发表于 2014-8-23 10:09
....
scanf_s("%c,%c",&a,1,&b,1);

同样的问题,这回加1加1.0都试了都没用。。所以我还是不明白所以然

elvo 发表于 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了。你可以试一试

Jack_McKing 发表于 2014-8-23 14:34:22

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

可是我又打开又试了一遍就行了,这是为什么啊,,你能不能尽量用中文解释一下。。

elvo 发表于 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安全的地方,都限定了边界,不让发生溢出

Jack_McKing 发表于 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安全在哪好去用
太感谢你了,你讲的非常清楚。。是我级别太低听的一知半解,我明白了它因为数据容易益处所以不安全,但是那个大小值是固定的还是什么我还是不太明白。。

elvo 发表于 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;
   wchar_twc,
            ws;

   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

Jack_McKing 发表于 2014-8-23 18:29:22

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

就是没大看懂才请求你给点通俗易懂的解释。。那个大小值到底是多少我还是不太明白怎样规定的。。

cheny3636 发表于 2014-8-26 12:48:43

本帖最后由 cheny3636 于 2014-8-26 12:57 编辑

1应该是代表指定scanf_s输入长度,用VS2013可以在建立项目的时候不勾选安全开发生命周期就可以用scanf了

Jack_McKing 发表于 2014-8-27 19:44:26

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

那输入长度是如何规定的呢。
页: [1]
查看完整版本: vs2013的问题(scanf和一个只可以看图的问题)