首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于sprintf_s与sscanf_s的有关问题

2012-10-28 
关于sprintf_s与sscanf_s的问题?问题1:C/C++ codechar* p new char[6]p 00000sprintf_s( p, 6, %

关于sprintf_s与sscanf_s的问题?
问题1:

C/C++ code
       char* p = new char[6];    p = "00000";    sprintf_s( p, 6, "%05d", 100);    delete []p;

这段代码,先给p 赋值以后 再用sprintf_s就会出现内存访问错误?这个怎么解释?
问题2:
C/C++ code
    char* Date = "20120926";    unsigned char ucTemp(0);    sscanf_s( (char*)Date, "%2的", &ucTemp);

这段代码,执行的时候不会出现问题,但是在程序结束的时候,就会出现堆栈问题. 我估计是因为我用%d的格式化成int型,但是放进一个UCHAR类型的变量, 在最后程序结束的时候释放变量ucTemp的时候出现堆栈问题!不知道这样的解释对不对! 但是当我把ucTemp作为一个全局变量的时候就不会出问题? 这样是不是我的解释就有问题!

[解决办法]
首先 p = "00000"; 就不对。

p是地址。 你不能这样赋值。

应该这样吧

p[0] = 

p[1] =
....
[解决办法]
探讨
引用:

C/C++ code
char* Date = "20120926";
unsigned char ucTemp;
int v;
sscanf_s( (char*)Date, "%2d", &v);//%2d告诉scanf_s读取两位十进制数“20”并填写到&v开始的4个字节中0x14 0x00 0x00 0x00
ucTe……
这样是没问题,用假如我把 int v,定义为UCHAR v 就会出错,但是UCHAR v是全局变量的时候就不会出错!

[解决办法]
unsigned char就一个字节的空间,%d期待一个int,起码要4个字节的空间,明显越界了。
只要是越界,就是不好的;所谓声明成全局变量,不过是内存的位置不一样罢了,不过还是越界。
s系列的安全函数,不是所有的越界都可能检查出来的,比如全局变量所在的内存,也许就不会设置内存的边界检查区域,所以不一定能检查报错。

可以先用debugger跟踪一下,理解下所谓的越界是怎么一回事,然后查查s系列函数的一些原理,它是怎么检测越界的。

热点排行