我想在不使用sscanf
的情况下为C vsscanf
实现包装函数,因为在我的环境中vsscanf
()不存在sscanf
。我也不想完全实现sscanf
,因为我需要考虑所有可能的情况。我在google中看到了一些samples,但它没有考虑所有情况。
所以现在我想实现如下:
int my_sscanf(char * buf, char format[], ...)
{
va_list vargs = {0};
va_start(vargs, format);
//some loop to get the variable aguments
//and call again sscanf() here.
va_end (vargs);
}
答案 0 :(得分:3)
哎哟!这是一把锤子;用它来击打自己会更有趣。说真的,这是一个非平凡的主张。
你需要一个循环来扫描格式字符串,当它们是正常字符时从缓冲区中读取字符,记住格式中的空格在缓冲区中咀嚼零个或多个空格。遇到转换规范时,您需要创建包含用户提供的转换规范和%n
转换规范的单例格式字符串。你将调用:
int pos;
int rc = sscanf(current_pos_in_buf, manufactured_format_with_percent_n,
appropriate_pointer_from_varargs, &pos);
如果rc
不是1,您就会失败。否则,使用pos
中存储的值更新缓冲区中的当前位置,然后重复。请注意,扫描转换规范并非易事。此外,如果规范中存在赋值抑制*
,则您必须期望从sscanf()
返回0(并且不从变量args提供适当的指针)。
答案 1 :(得分:0)
尝试告诉编译器将代码编译为C99。如果仍然不起作用,则您的libc不符合C99标准 - 在这种情况下,请获取正确的libc。
E.g。如果您正在使用gcc,请尝试将-std=c99
添加到编译器命令行。
答案 2 :(得分:0)
使用预处理器执行此操作的方法稍微简单一点,但它有点hacky。以此为例:
#define my_sscanf(buf, fmt, ...) { \
do_something(); \
sscanf((buf), (fmt), __VA_ARGS__); \
do_something_else(); }