Answers:
如果您已经知道char *的大小,请改用它
char* data = ...;
int size = ...;
std::string myString(data, size);
这不使用strlen。
编辑:如果字符串变量已经存在,请使用assign():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
通过构造函数传递它:
const char* dat = "my string!";
std::string my_string( dat );
您可以使用函数string.c_str()进行其他选择:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
返回const char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
我想提到一种使用用户定义文字的新方法s
。这不是什么新鲜事物,但是会更加普遍,因为它是在C ++ 14标准库中添加的。
在一般情况下是多余的:
string mystring = "your string here"s;
但是它允许您对宽字符串也使用自动:
auto mystring = U"your UTF-32 string here"s;
这才是真正闪耀的地方:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
我一直在努力与MSVC2005一起使用std::string(char*)
构造函数,就像最受好评的答案一样。正如我在始终受信任的http://en.cppreference.com/w/cpp/string/basic_string/basic_string上将此变体列出为#4一样,我认为即使是旧的编译器也可以提供此变体。
我花了很长时间才意识到这个构造函数绝对拒绝与之匹配(unsigned char*)
!我收到了关于无法与std::string
参数类型匹配的这些无法理解的错误消息,这绝对不是我想要的。只是用争论std::string((char*)ucharPtr)
解决了我的问题......!
char* data;
std::string myString(data);
data
仍未初始化(空)。
不知道为什么除了Erik之外没有人提到这一点,但是根据此页面,赋值运算符可以正常工作。无需使用构造函数,.assign()或.append()。
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(和+=
)内部的“新” 。似乎不是像这样的文字发生,而是像char*
事情一样。本文讨论了此类报告是否实际上是泄漏的问题。但是,如果我将分配更改destString = std::string(srcCharPtr);
为valgrind,泄漏报告将消失。YMMV。
Constructs an object of class basic_string and determines its initial string value from the array
。它说的是价值,与缓冲区或指针所有权无关。