读书人

关于格式字符串解决方案

发布时间: 2012-09-18 16:21:42 作者: rapoo

关于格式字符串
大家好,我写了测试程序,想通过函数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,转换下一个

读书人网 >C++

热点推荐