2016-02-12 49 views
0

此问题与:Get number of characters read by sscanf? 然而,它特别要求如何包装可变参数(C++ 11 variadic模板)以实现该效果。获取通过包装函数使用std :: sscanf函数扫描的字符数。扩展可变参数模板

我想有一个函数:

int my_sscanf(int& ncharswritten, const char* str, const char* fmt, ...) 
{ 
} 

返回的指定格式事物的正常数量,但还(如例如参考参数)返回写入的字符数。

正如在上面的链接中提到的,建议的解决方法是知道写入的字符数是使用fmt末尾的%n。问题是如何在现实生活中实现这一点,而不必每次都手动添加。

+0

您需要%N'加上'以某种方式格式字符串。最简单的'std :: string fmt2 = fmt +“%n”; ... sscanf(... fmt2.c_str()...);' –

+0

Thanks Mats,魔鬼详细介绍了如何在可变参数列表末尾添加所需的额外int *参数到sscanf( ),将%n添加到fmt的结尾后。 – rveale

回答

1

您可以使用类似:

template <typename...Ts> 
int my_sscanf(int& ncharswritten, const char* str, const char* fmt, Ts&&...ts) 
{ 
    return sscanf(std, 
        (fmt + std::string("%n")).c_str(), 
        std::forward<Ts>(ts)..., 
        &ncharswritten); 
} 
+0

感谢jarod,这基本上是我发现的,我会接受你的答案。我不明白它的std :: forward 部分,或者Ts &&位。 – rveale

+0

这是转发参数(保留常量,右值/左值,...)的方式。在你的情况下通过复制应该没问题,参数是指针(所以'Ts * ... ts'可能会更好)。 – Jarod42

+0

啊,我明白了。在sscanf的情况下,他们总是指针,所以我想我只是在这种情况下幸运?我的例子下面的原因是某些原因... – rveale

0

我解决了问题,有点绕缠着后:

template<typename... Args> 
    int my_scanf(int& nchars, const std::string& buffer, const char* fmt, Args... args) 
    { 

    std::string fmtstr = std::string(fmt); 
    fmtstr+="%n"; 
    nchars=-1; 

    int nargswritten = std::sscanf(buffer.c_str(), fmtstr.c_str(), args..., &nchars); 

    fprintf(stdout, "I consumed [%d] chars\n", nchars); 


    //REV: This won't work if it goes past EOF, so need to handle how many were written if conspos wasn't filled becuase 
    //it hit EOF partway through... 
    return (nargswritten-1); //REV: subtracting one because of added %n 

    } 
相关问题