Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VS2010,scanf,奇怪的行为_C_Visual Studio 2010_Scanf - Fatal编程技术网

VS2010,scanf,奇怪的行为

VS2010,scanf,奇怪的行为,c,visual-studio-2010,scanf,C,Visual Studio 2010,Scanf,我正在将一些源代码从VC6转换为VS2010。代码是用C++/CLI编写的,它是一个MFC应用程序。它包括一行: BYTE mybyte; sscanf(source, "%x", &mybyte); 这对于VC6来说很好(超过15年),但在VS2010中会造成问题,所以我创建了一些测试代码 void test_WORD_scanf() { char *source = "0xaa"; char *format = "%x"; int result = 0;

我正在将一些源代码从VC6转换为VS2010。代码是用C++/CLI编写的,它是一个MFC应用程序。它包括一行:

BYTE mybyte;
sscanf(source, "%x", &mybyte);
这对于VC6来说很好(超过15年),但在VS2010中会造成问题,所以我创建了一些测试代码

void test_WORD_scanf()
{
    char *source = "0xaa";
    char *format = "%x";
    int  result = 0;

    try
    {
        WORD pre    = -1;
        WORD target = -1;
        WORD post   = -1;

        printf("Test (pre scan):  stack: pre=%04x, target=%04x, post=%04x, sourse='%s', format='%s'\n", pre, target, post, source, format);
        result = sscanf(source, format, &target);
        printf("Test (post scan): stack: pre=%04x, target=%04x, post=%04x, sourse='%s', format='%s'\n", pre, target, post, source, format);
        printf("result=%x", result);

        // modification suggested by Werner Henze.
        printf("&pre=%x sizeof(pre)=%x, &target=%x, sizeof(target)=%x, &post=%x, sizeof(post)=%d\n", &pre, sizeof(pre), &target, sizeof(target), &post, sizeof(post));
    }
    catch (...)
    {
        printf("Exception: Bad luck!\n");
    }
}
构建这个(在调试模式下)没有问题。运行它会产生奇怪的结果,我无法解释。首先,我按照预期从两个printf statemens获取输出。然后是运行时警告,这对我来说是意想不到的

Test (pre scan):  stack: pre=ffff, target=ffff, post=ffff, source='0xaa', format='%x'
Test (post scan): stack: pre=ffff, target=00aa, post=ffff, source='0xaa', format='%x'
result=1

Run-Time Check Failure #2 - Stack around the variable 'target' was corrupted.
使用调试器,我发现从函数返回时会触发运行时检查失败。有人知道运行时检查失败的原因吗?我用过谷歌,但找不到任何建议

在实际代码中,sscanf中使用的不是一个字,而是一个字节(我有一个字节版本的测试函数)。这导致了“%x”格式的实际堆栈损坏(用0覆盖变量pre),而使用“%hx”(我希望是正确的格式)仍然会在覆盖变量prev的较低字节时造成一些问题

欢迎提出任何建议

注意:我编辑了示例代码以包含来自sscanf()的返回结果

亲切问候,


Andre Steenveld.

sscanf
%x
。如果提供了
字节
的地址,则会出现缓冲区溢出/堆栈覆盖<代码>%hx将显示

解决方案是使用一个int变量,让
sscanf
写入该变量,然后将
WORD
BYTE
变量设置为读取值

int x;
sscanf("%x", "0xaa", x);
BYTE b = (BYTE)x;
顺便说一句,为了你的测试和信息

运行时检查失败#2-变量“target”周围的堆栈已损坏


您还应该打印出变量的地址,您可能会看到编译器在变量pre/target/post之间添加了一些填充/安全检查空间。

解决了问题。我假设sizeof(WORD)==sizeof(int),这是错误的!我真傻我在padding/secutiry check空格上测试了你的评论,发现了它。一个有用的建议,再次谢谢。@PapaAtHome我很高兴我能帮上忙。如果您认为我的答案有帮助,请随时投票支持:-)。