关于格式字符串解决方案
关于格式字符串
大家好,我写了测试程序,想通过函数locate_set_val把"resolution=1280x720\n"中的1280和720分别提取出来,但是不成功,请大家指点一下,谢谢!具体程序如下:
------解决方案--------------------
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,转换下一个
大家好,我写了测试程序,想通过函数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,转换下一个