如何使用stringstream作为c ++函数的参数?

时间:2014-02-09 11:02:28

标签: c++ string function concatenation stringstream

我一直在寻找与其他基元附加字符串的解决方案,并发现stringstream是最简单的解决方案。但是,我想简化这个过程,所以我想制作一个简化其使用的功能。如果你提出了连接的替代方法,我需要最终结果为char *。我用了一个循环(i):

std::stringstream ss;
ss << "test" << i;      
char* name = new char[ss.str().size() + 1];//allocate
strcpy(name, ss.str().c_str());//copy and put (char*)c_str in name

所以输出是链接test1test2test3 ...这是我能够集合的最合理的解决方案。我试图将它放入一个易于使用的功能中,但遇到了问题。我想做类似的事情:

char* string_to_pointer( char* dest, std::stringstream* _ss ) {
   char* result = new char[_ss->str().size() + 1];
   strcpy(result, _ss->str().c_str());
   return result;
}
然后我可以做类似的事情:

std::stringstream ss;
ss << "test" << i;      
char* name = string_to_pointer( name, &ss );

我对c ++很陌生,这似乎在语法上正确使用,但我遇到了运行时问题,并欢迎解决方案如何在一个易于使用的功能中获得这个而不会导致Boost。

3 个答案:

答案 0 :(得分:0)

char* string_to_cstring ( const std::string &_ss )

会更干净!与string_to_cstring(ss.str())

一起使用

需要返回的C-String是可变的吗?因为如果没有,只需在需要的地方使用ss.str().c_str()

或使用:

char* result = new char[ss.str().size() + 1] (); // value initialized
ss.str().copy(result,std::string::npos);

答案 1 :(得分:0)

使用std::stringstream::str()函数检索字符串的内容。

示例:

int foo = 42;
double bar = 12.67;

std::stringstream ss;
ss << "foo bar - " << foo << ' ' << bar;

std::string result = ss.str();

如果您不想进一步修改字符串,现在可以简单地调用result.c_str()来获取const char*。但是,如果您确实需要可修改的char*,则必须将字符串的内容复制到cstring:

std::unique_ptr<char[]> cstring = new char[result.size() + 1];
strcpy(cstring.get(), result.c_str());

答案 2 :(得分:0)

这样的事情:

#include <string>
#include <sstream>

class ToString {
  std::ostringstream stream;
public:
  template<typename T>
  inline ToString &operator<<(const T&val) {
    stream << val;
    return *this;
  }

  inline operator std::string() const {
    return stream.str();
  } 
};

你可以像这样使用它:

std::string str = ToString() << "Test " << 5 << " and " << 4.2;