仅带有std :: string的C ++变量参数 [英] C++ variable arguments with std::string only
问题描述
我正在尝试创建一个函数,该函数接受可变数量的std :: string参数并使用它格式化字符串。
示例:
Test :: formatLine(const string :: format,...)
{
const std :: string缓冲区;
va_list args;
va_start(args,format);
vsprintf(buffer.c_str,format.c_str,args);
va_end(args);
cout<<缓冲<<恩德尔
}
编译此代码段错误:
错误1错误C3867:'std :: basic_string< char,std :: char_traits< char>,std :: allocator< char>> ::: c_str':函数调用缺少参数列表;使用'& std :: basic_string< char,std :: char_traits< char>,std :: allocator< char>> :: c_str'创建指向成员
的指针
我要实现的目标:
测试t =测试();
t.formatLine( Hello%s!,先生);
应打印先生您好!
t.formatLine(你好%s%s!今天你好吗?,好,先生, );
应该打印你好,先生!您今天好吗?
甚至可以使用 va_list
和 vsprintf
仅带有 std :: string
,避免 char 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<<缓冲<<恩德尔
}
使用 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]<<恩德尔
}
首先,它是 buffer.c_str()
和 format.c_str()
(请注意括号)。
第二, vsprintf
的第一个参数应该是足够大小的可修改缓冲区。您正在尝试传递 const char *
指向仅一个字节大的缓冲区。
您可以使用 vector< char>
作为缓冲区持有人(很容易调整大小)。问题是,无法从 vsprintf
中获得所需的缓冲区大小。一种技术是分配一些初始缓冲区,然后重复调用 vsnprintf
(注意'n'),每次函数说它太小时,缓冲区的大小就会加倍。 / p>
I'm trying to create a function that takes a variable amount of std::string arguments and formats a string with it.
Example:
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;
}
Compiling this snippet errors:
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
What I want to achieve:
Test t = Test();
t.formatLine("Hello %s!", "monsieur");
should print Hello monsieur!
t.formatLine("Hello %s %s! How %s you today?", "good", "sir", "are");
should print Hello good sir! How are you today?
Is it even possible to use va_list
and vsprintf
with std::string
only, avoiding char buffer[size]
?
Working example (so far) with fixes suggested by Igor, using buffer:
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;
}
Using Igor Tandetnik's suggestion and sample code I finally got a working example that does not use 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;
}
First, it's buffer.c_str()
and format.c_str()
(note the parentheses).
Second, the first parameter of vsprintf
should be a modifiable buffer of sufficient size. You are trying to pass a const char*
pointing to a buffer just one byte large.
You could use vector<char>
as a buffer holder (it's easy to resize). The problem is, there's no way to get the required buffer size out of vsprintf
. One technique is to allocate some initial buffer, then call vsnprintf
(note the 'n') repeatedly, doubling the size of the buffer every time the function says it's too small.
这篇关于仅带有std :: string的C ++变量参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!