[问题] sscanf_s的问题,和取代方法?

楼主: liaommx (Orz)   2021-12-02 22:05:27
开发平台(Platform): (Ex: Win10, Linux, ...)
windows 10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
visual studio community 20xx
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
NA
问题(Question):
手边有一个前辈开发的MFC的程式,
不确定开发时期的IDE环境是什么
到我手上的时候利用vs community 20xx可以正常开启.
也可以编译
但是有引用到一个函数,
里面有一行函数执行到,就会出问题.
跳error
若在vs的debug环境下按下f5可以继续执行
但是如果把程式release建立后直接copy用到的dll和exe
执行到这程式就会error,然后程式自动关闭.
跳error的点在该函式的最后一行的 } 这边,
但是只要不跳出程式,就不影响结果.
因为程式不能copy出来
而且mvc我也不是那么懂,只是略会使用而已.
只能用印象写
以下是大略的程式
有8组文字框,
分别叫做var_input[8]
里面许可的文字是hex,
char var_a[8]={0}
sscanf_s(var_input[0],"%2X",&var_a[0]);
我印象中大概是这样的写法.
可能会有一些小错误,
不过大概的程式内容就是
把8个文字框var_input输入的hex值copy到var_a的阵列中
有一个重点,
这边的var_a的最后一个值 " 不是\0 "
(因为是hex编码,整组不需要是完整的字符)
后续另外有别的函式会把整串var_a做处理.
只要我把sscanf_s这行注解,
mfc就可以正常执行,
但是如果只要sscanf_s这行执行到
就会跳错误
run time check failure stack around the variable var_a was corrupted
程式码本身逻辑没什么问题,
有问题的应该是函数使用的方法,或是ide的设定需要调整.
有用vs的中断点去看变量,
var_input[0]如果是写13
那么var_a[0]就填入hex是13的那个文字,(不一定能正确显示)
8个文字框都可以正常存入hex或执行.
但是却有额外的错误
目前有找了几个方法,
ex:把字串加大,变成var_a[9]
并在var_a[8]写入\0
这个目前看起来没有用.
project->配置属性->代码生成....(等等
我在visual community 的ide中找不到这设置..
这应该是不同ide的作法.
不知道各位先进有没有什么想法可以提供,
不管是避免,或是改善的作法都可以提点一二
谢谢
作者: nh60211as   2021-12-02 22:22:00
编译的时候那一行有什么警告讯息吗https://i.imgur.com/h2sUimB.png 大概是呼叫方法错误你要用 %2X 解析的话应该用 int 来接
作者: LPH66 (-6.2598534e+18f)   2021-12-02 22:28:00
就是上面这个原因而已, int 范围比 char 大造成读进来之后覆蓋到了阵列之后的空间VC 的 debug 版本会在函式结束时检查是否区域变量堆叠完整这里因为覆蓋到了的空间被检查出来因此死在函式结束处(这也就是二楼图中的错误讯息框在说的事情)正确的做法是用一个 int 的暂时变量, sscanf 进那里去再把其值搬回 char 变量
楼主: liaommx (Orz)   2021-12-03 07:07:00
感谢二位的指导,应该就是这个问题没错,再次谢谢

Links booklink

Contact Us: admin [ a t ] ucptt.com