仅带有std :: string的C ++变量参数 [英] C++ variable arguments with std::string only

查看:84
本文介绍了仅带有std :: string的C ++变量参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个函数,该函数接受可变数量的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆