如何在不使用vsscanf()的情况下为C sscanf()实现包装函数

时间:2014-04-25 16:10:32

标签: c variadic-functions scanf

我想在不使用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);
}

3 个答案:

答案 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(); }