Vsscanf替换VS无法正常工作

时间:2014-09-09 19:59:02

标签: c++ printf scanf

嘿所有我需要使用vsscanf,因为一些遗留代码做了某种格式比较的方式,微软认为他们不需要包含vsscanf所以我很难尝试找到它的实现。找到http://www.flipcode.net/archives/vsscanf_for_Win32.shtml因为它是第一个链接之一,它对我来说完全可读和易懂,但由于某种原因我无法让它工作。

不会包含vsscanf的实现,因为它位于该链接中。我只是复制并粘贴它并包含文件。简单的代码我想运行它来测试它并确保我得到的值可以访问并复制到其他地方,但我得到一个例外。

首先我正在测试的代码:

int matches = 0;
void** argList = new void*[3];
matches = vsscanf("Hello123Test321", "Hello%iTest%i", (va_list)argList);

我得到的异常是(项目)中(位置)的未处理异常:0xC0000005:访问冲突。当它到达内衬的sscanf部分时会发生。

(Snippit from source found at link above)
void *savedESP;
_asm
{
    mov     savedESP, esp;
    mov     esp, newStack;
    call    sscanf;            //THIS IS WHERE THE EXCEPTION GET THROWN
    mov     esp, savedESP;
    mov     result, eax;
}

我觉得无论我做什么都是愚蠢的,只需要有人向我指出。我只需要进行比较,确保有正确的数量,并且有一个结构,其中传递了所有值。

由于

1 个答案:

答案 0 :(得分:0)

您分配了一个包含3个指针的数组:

void** argList = new void*[3];

但那些指针并没有指向任何东西。 sscanf将它读取的整数存储在指针所指向的内存中,但它是随机存储器。

在致电vsscanf之前,你可能需要这样的话:

void** argList = new void*[2];
int* values = new int[2];
argList[0]=(void *)values;
argList[1]=(void *)values+1;

但我也认为这个功能永远不会奏效。它只为参数创建一个新堆栈。

mov     esp, newStack;
call    sscanf;

但是很可能sscanf函数将使用堆栈,调用其他函数或在堆栈上存储寄存器。允许堆栈必须更大。或者更好的是,它应该只使用普通堆栈而不是自己创建一个堆栈。