317

我需要使用std::string来存储由fgets(). 为此,我需要将char*返回值 fromfgets()转换std::string为存储在数组中。如何才能做到这一点?

4

12 回答 12

461

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

const char *s = "Hello, World!";
std::string str(s);

请注意,此构造将字符列表深度复制到sand sshould not be nullptr,否则行为未定义。

于 2009-07-28T17:57:34.587 回答
158

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

char* data = ...;
int size = ...;
std::string myString(data, size);

这不使用 strlen。

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

std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
于 2009-07-28T17:59:21.090 回答
47

大多数答案都是关于构建 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
于 2015-10-24T12:02:41.103 回答
32

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

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

于 2009-07-28T18:12:06.010 回答
21

通过构造函数传入:

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();
于 2009-07-28T17:59:12.277 回答
12
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
于 2013-04-03T10:27:31.320 回答
9
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
于 2014-06-10T09:26:03.473 回答
6

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

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

string mystring = "your string here"s;

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

auto mystring = U"your UTF-32 string here"s;

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

string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
于 2013-12-24T00:19:54.620 回答
5

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

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

于 2015-07-13T15:05:49.243 回答
1
char* data;
std::string myString(data);
于 2009-07-28T17:56:57.583 回答
1

不知道为什么除了 Erik 之外没有人提到这一点,但根据这个页面,赋值运算符工作得很好。无需使用构造函数、.assign() 或 .append()。

std::string mystring;
mystring = "This is a test!";   // Assign C string to std:string directly
std::cout << mystring << '\n';
于 2014-05-20T02:14:09.433 回答
0

从 C 风格字符串转换为 C++ 标准字符串更容易

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

第一个是使用构造函数,

char chText[20] = "I am a Programmer";
// using constructor
string text(chText);

第二个是使用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);

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

// 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;

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

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

// c++ string
string text;


// convertion from char string to c++ string
text = chText;

第三个有点直截了当,可以在两种情况下使用

  1. 在我们声明和初始化的时候
  2. 当我们在对象创建或初始化后多次分配时
于 2021-10-27T18:39:05.013 回答