我正在尝试创建一个函数,该函数采用可变数量的 std::string 参数并用它格式化字符串。
例子:
Test::formatLine(const string::format, ...)
{
const std::string buffer;
va_list args;
va_start(args, format);
vsprintf(buffer.c_str, format.c_str, args);
va_end(args);
cout << buffer << endl;
}
编译此代码段错误:
Error 1 error C3867: 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': function call missing argument list; use '&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str' to create a pointer to member
我想要达到的目标:
Test t = Test();
t.formatLine("Hello %s!", "monsieur");
应该打印Hello monsieur!
t.formatLine("Hello %s %s! How %s you today?", "good", "sir", "are");
应该打印Hello good sir! How are you today?
甚至可以使用va_list
and vsprintf
with std::string
only, Avoidchar buffer[size]
吗?
工作示例(到目前为止),Igor 建议使用缓冲区进行修复:
void Test::formatLine(string format, ...)
{
char buffer[256];
va_list args;
va_start(args, format);
vsprintf_s(buffer, format.c_str(), args);
va_end(args);
cout << buffer << endl;
}
使用Igor Tandetnik的建议和示例代码,我终于得到了一个不使用 char buffer[size] 的工作示例:
void Test::formatLine(string format, ...)
{
vector<char> buf(256);
va_list args;
va_start(args, format);
vsnprintf_s(&buf[0], buf.size(), buf.size() + strlen(format.c_str()), format.c_str(), args);
va_end(args);
cout << &buf[0] << endl;
}