我一直在寻找与其他基元附加字符串的解决方案,并发现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。
答案 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;