通过包装函数获取使用 std::sscanf 函数扫描的字符数。扩展可变模板参数
Get number of characters scanned with std::sscanf function via wrapper function. Expanding variadic template arguments
这个问题是关于:Get number of characters read by sscanf?
但是,它特别询问如何包装可变参数(C++11 可变参数模板)以达到效果。
我想要一个功能:
int my_sscanf( int& ncharswritten, const char* str, const char* fmt, ... )
{
}
其中 returns 指定的格式事物的正常数量,但此外(例如作为参考参数)returns 写入的字符数。
如上 link 所述,了解写入字符数的建议解决方案是在 fmt 末尾使用 %n。问题是如何在现实生活中实现这一点,而不必每次都手动将其添加到 fmt。
经过一番摸索,我解决了这个问题:
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
}
您可以使用类似的东西:
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);
}
这个问题是关于:Get number of characters read by sscanf? 但是,它特别询问如何包装可变参数(C++11 可变参数模板)以达到效果。
我想要一个功能:
int my_sscanf( int& ncharswritten, const char* str, const char* fmt, ... )
{
}
其中 returns 指定的格式事物的正常数量,但此外(例如作为参考参数)returns 写入的字符数。
如上 link 所述,了解写入字符数的建议解决方案是在 fmt 末尾使用 %n。问题是如何在现实生活中实现这一点,而不必每次都手动将其添加到 fmt。
经过一番摸索,我解决了这个问题:
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
}
您可以使用类似的东西:
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);
}