我知道这是一个常见的问题,但是在寻找参考资料和其他材料时,我找不到这个问题的明确答案.
请考虑以下代码:
#include <string>
// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;
Run Code Online (Sandbox Code Playgroud)
编译器告诉我它找不到重载的运算符char[dim].
这是否意味着在字符串中没有+运算符?
但在几个例子中,存在类似这样的情况.如果这不是连接更多字符串的正确方法,那么最好的方法是什么?
c++ string-concatenation standard-library stdstring operator-keyword
如果我想构造一个std :: string,其行如下:
std::string my_string("a\0b");
Run Code Online (Sandbox Code Playgroud)
我希望在结果字符串中有三个字符(a,null,b),我只得到一个.什么是正确的语法?
我std::string什么时候应该使用,什么时候应该char*用来管理charC++中的s 数组?
char*如果性能(速度)至关重要,并且由于内存管理,您愿意接受一些有风险的业务,那么您似乎应该使用它.
是否还有其他需要考虑的方案?
问题:我有一个整数; 这个整数需要转换为stl :: string类型.
在过去,我曾经stringstream做过转换,这有点麻烦.我知道C方式是做一个sprintf,但我宁愿做一个类型安全(呃)的C++方法.
有一个更好的方法吗?
这是我过去使用的字符串流方法:
std::string intToString(int i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Run Code Online (Sandbox Code Playgroud)
当然,这可以改写如下:
template<class T>
std::string t_to_string(T i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为这是一个相当"重量级"的实施.
Zan指出,调用非常好,但是:
std::string s = t_to_string(my_integer);
Run Code Online (Sandbox Code Playgroud)
无论如何,一个更好的方式将是......很好.
有关:
我注意到在我的SGI STL参考文献中,有一个关于角色特征的页面,但我看不出这些是如何使用的?他们是否替换了string.h函数?它们似乎没有被使用std::string,例如,length()方法on std::string不使用Character Traits length()方法.为什么角色特征存在并且它们是否曾在实践中使用过?
CString非常方便,同时std::string与STL容器更兼容.我在用hash_map.但是,hash_map不支持CString作为键,所以我想转换CString成std::string.
编写CString哈希函数似乎需要花费很多时间.
CString -----> std::string
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
std::string -----> CString:
inline CString toCString(std::string const& str)
{
return CString(str.c_str());
}
Run Code Online (Sandbox Code Playgroud)
我对吗?
编辑:
以下是更多问题:
我怎么能转换wstring,CString彼此?
//wstring -> CString,
std::wstring src;
CString result(src.c_str());
//CString->wstring.
CString src;
::std::wstring des(src.GetString());
Run Code Online (Sandbox Code Playgroud)
有什么问题吗?
我怎么能转换std::wstring,std::string彼此?
我正在寻找最优雅的方法将字符串向量内部转换为字符串.以下是我现在使用的解决方案:
static std::string& implode(const std::vector<std::string>& elems, char delim, std::string& s)
{
for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.end(); ++ii)
{
s += (*ii);
if ( ii + 1 != elems.end() ) {
s += delim;
}
}
return s;
}
static std::string implode(const std::vector<std::string>& elems, char delim)
{
std::string s;
return implode(elems, delim, s);
}
Run Code Online (Sandbox Code Playgroud)
那里还有其他人吗?
我最近看到我的一位同事std::string用作缓冲区:
std::string receive_data(const Receiver& receiver) {
std::string buff;
int size = receiver.size();
if (size > 0) {
buff.resize(size);
const char* dst_ptr = buff.data();
const char* src_ptr = receiver.data();
memcpy((char*) dst_ptr, src_ptr, size);
}
return buff;
}
Run Code Online (Sandbox Code Playgroud)
我猜这家伙想利用返回字符串的自动销毁功能,因此他不必担心释放分配的缓冲区。
这对我来说有点奇怪,因为根据cplusplus.com,该data()方法返回const char*指向由字符串内部管理的缓冲区的指针:
const char* data() const noexcept;
Run Code Online (Sandbox Code Playgroud)
Memcpying到一个const char指针?AFAIK只要知道我们所做的事情就不会造成伤害,但是我错过了什么吗?这很危险吗?
使用http://en.cppreference.com/w/cpp/string/basic_string_view作为参考,我认为没有办法更优雅地做到这一点:
std::string s = "hello world!";
std::string_view v = s;
v = v.substr(6, 5); // "world"
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,天真的方法是一个陷阱,并留下v暂时的悬挂参考:
std::string s = "hello world!";
std::string_view v(s.substr(6, 5)); // OOPS!
Run Code Online (Sandbox Code Playgroud)
我似乎记得有些东西可能会添加到标准库中以返回子字符串作为视图:
auto v(s.substr_view(6, 5));
Run Code Online (Sandbox Code Playgroud)
我可以想到以下解决方法:
std::string_view(s).substr(6, 5);
std::string_view(s.data()+6, 5);
// or even "worse":
std::string_view(s).remove_prefix(6).remove_suffix(1);
Run Code Online (Sandbox Code Playgroud)
坦率地说,我认为这些都不是很好.现在我能想到的最好的事情是使用别名来简化事情.
using sv = std::string_view;
sv(s).substr(6, 5);
Run Code Online (Sandbox Code Playgroud) 以下C++代码是否格式良好:
void consumer(char const* p)
{
std::printf("%s", p);
}
std::string random_string_generator()
{
// returns a random std::string object
}
consumer(random_string_generator().c_str());
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在创建临时std :: string对象并获取c_str()指针后,没有什么能阻止std :: string对象被破坏(或者我错了?).如果代码一切正常,你能指点我的标准吗?当我使用g ++进行测试时,它确实有效.