将char*转换为std :: string

Jon*_*ior 231 c++ stdstring

我需要使用一个std::string来存储检索到的数据fgets().要做到这一点,我需要将转换char*返回值从fgets()std::string阵列中的存储.如何才能做到这一点?

Jes*_*der 339

std::string 有一个构造函数:

const char *s = "Hello, World!";
std::string str(s);
Run Code Online (Sandbox Code Playgroud)

只要确保你char *的不是NULL,否则行为是未定义的.

  • 它是浅的还是深的副本? (22认同)
  • Standard表示构造函数参数"不应为空指针" - 它不指定抛出任何异常. (13认同)
  • 会是怎么回事? (6认同)
  • @Madhatter它是一个深层拷贝.指针分配将保留,字符串将使自己成为新的分配. (6认同)
  • @pushkin没有`str`只是一个变量名.它可以是任何东西:`S`,`abc`,`l`,`I`,`strHelloWorld`.显然有些选择比其他选择更好.但是对于这个例子,`str`是完全可以接受的. (3认同)
  • 我相信新标准会在空指针上的 `basic_string` 中抛出一个 `std::logic_error`。 (2认同)

Eug*_*ene 115

如果您已经知道char*的大小,请改用它

char* data = ...;
int size = ...;
std::string myString(data, size);
Run Code Online (Sandbox Code Playgroud)

这不使用strlen.

编辑:如果字符串变量已存在,请使用assign():

std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Run Code Online (Sandbox Code Playgroud)

  • int size = strlen(data); (3认同)
  • @ZackLee 它将为字节分配新的内存并将它们全部复制到那里,尽可能深。如果您想要浅拷贝的潜力,您需要将一个 std::string 复制到另一个中。然后我认为一些实现可以做一个浅拷贝。 (2认同)

Pau*_*aul 28

我需要使用std :: string来存储由fgets()检索的数据.

为什么fgets()在编写C++时使用?为什么不std::getline()呢?


Atu*_*tul 23

大多数答案都谈到建设 std::string.

如果已经构造,只需使用赋值运算符.

std::string oString;
char* pStr;

... // Here allocate and get character string (e.g. using fgets as you mentioned)

oString = pStr; // This is it! It copies contents from pStr to oString
Run Code Online (Sandbox Code Playgroud)

  • 是否可以在将`pStr`赋值给`oString`后将其删除而不影响后面的内容? (2认同)

Jam*_*son 13

通过构造函数传入:

const char* dat = "my string!";
std::string my_string( dat );
Run Code Online (Sandbox Code Playgroud)

您可以使用函数string.c_str()以另一种方式:

std::string my_string("testing!");
const char* dat = my_string.c_str();
Run Code Online (Sandbox Code Playgroud)

  • `c_str()`返回`const char*` (3认同)

小智 8

const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
Run Code Online (Sandbox Code Playgroud)


SHA*_*AIN 8

从 C 样式字符串转换为 C++ std 字符串更容易

我们可以通过三种方式将 C 样式字符串转换为 C++ std 字符串

第一个是使用构造函数,

char chText[20] = "I am a Programmer";
// using constructor
string text(chText);
Run Code Online (Sandbox Code Playgroud)

第二个是使用string::assign方法

// char string
char chText[20] = "I am a Programmer";

// c++ string
string text;

// convertion from char string to c++ string
// using assign function
text.assign(chText);
Run Code Online (Sandbox Code Playgroud)

第三个是赋值运算符(=),其中string类使用运算符重载

// char string
char chText[20] = "I am a Programmer";

// c++ string
// convertion from char string to c++ string using assignment operator overloading
string text = chText;
Run Code Online (Sandbox Code Playgroud)

第三个也可以像下面这样写 -

// char string
char chText[20] = "I am a Programmer";

// c++ string
string text;


// convertion from char string to c++ string
text = chText;
Run Code Online (Sandbox Code Playgroud)

第三个有点简单,可以在两种情况下使用

  1. 当我们声明和初始化时
  2. 当我们在对象创建或初始化后多次分配时


Eri*_*zen 6

我想提到一种使用用户定义文字的新方法s。这不是新的,但它会更常见,因为它被添加到 C++14 标准库中。

在一般情况下基本上是多余的:

string mystring = "your string here"s;
Run Code Online (Sandbox Code Playgroud)

但它允许您使用 auto,也可以使用宽字符串:

auto mystring = U"your UTF-32 string here"s;
Run Code Online (Sandbox Code Playgroud)

这就是它真正闪耀的地方:

string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但似乎您需要在代码中执行“using namespace std::literals;”才能使用它。 (2认同)

use*_*286 6

我一直在努力使用 MSVC2005 来使用std::string(char*)构造函数,就像评价最高的答案一样。当我看到这个变体在始终受信任的http://en.cppreference.com/w/cpp/string/basic_string/basic_string上列为 #4 时,我想即使是旧的编译器也提供了这个。

我花了很长时间才意识到这个构造函数绝对拒绝与(unsigned char*)作为参数匹配!我收到了这些关于无法与参数类型匹配的难以理解的错误消息std::string,这绝对不是我的目标。只是用论点std::string((char*)ucharPtr)解决了我的问题......呃!


Pre*_*sen 5

char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
Run Code Online (Sandbox Code Playgroud)