关于格式字符串解决方案

关于格式字符串
大家好,我写了测试程序,想通过函数locate_set_val把"resolution=1280x720\n"中的1280和720分别提取出来,但是不成功,请大家指点一下,谢谢!具体程序如下:

C/C++ code


#include <stdio.h>
#include <stdarg.h>
#include <string.h>
using namespace std;

static int locate_set_val(char* dst, const char *item, const char * format, ...)
{
    char* key = NULL, *end = NULL, val[20];
    key = strstr(dst, item);
    if(NULL != key)
    {
        size_t offset = strlen(item) + 1;
        end = strchr(key + offset,'\n');
        if(NULL != end)
        {
            size_t len = end - (key + offset);
            strncpy(val, key + offset, len);
            val[len] = '\0';
            va_list args;
            va_start(args, format);
            len = sscanf(val, format, args);
            va_end(args);
            if(len > 0)
            {
                return 0;
            }
        }
    }
    return -1;
}

int main()
{
  char dst[] = "resolution=1280x720\n";
  char item[] = "resolution";
  unsigned int height = 0, width = 0;
  locate_set_val(dst, item, "%ux%u", &height, &width);
  return 0;
}




------解决方案--------------------
len = sscanf(val, format, args);
这行错了.
sscanf没这种重载
------解决方案--------------------
int vsscanf(const char *str, const char *format, va_list ap);

用这个。

sscanf是使用不定参数,内部自己获取自己的参数栈地址开始解析的。
vsscanf是直接传入其他地方传来的参数栈的地址,内部直接从该地址开始解析。

------解决方案--------------------
mingw stdio.h
int __cdecl __MINGW_NOTHROW vsscanf (const char * __restrict__,
const char * __restrict__, __VALIST);

msdn未查到
------解决方案--------------------
如果字符串前面的部分resolution=是固定的,可以跳过这个前缀直接用strtod函数转换,然后跳过x,转换下一个