【发布时间】:2010-11-14 19:19:10
【问题描述】:
我需要使用std::string 来存储fgets() 检索到的数据。为此,我需要将 char* 返回值从 fgets() 转换为 std::string 以存储在数组中。如何做到这一点?
【问题讨论】:
我需要使用std::string 来存储fgets() 检索到的数据。为此,我需要将 char* 返回值从 fgets() 转换为 std::string 以存储在数组中。如何做到这一点?
【问题讨论】:
从 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;
第三个比较简单,两种情况都可以使用
【讨论】:
std::string 有一个构造函数:
const char *s = "Hello, World!";
std::string str(s);
请注意,此构造深度复制s 和s 处的字符列表不应为nullptr,否则行为未定义。
【讨论】:
str 只是一个变量名。可以是任何东西:S、abc、l、I、strHelloWorld。显然,有些选择比其他选择更好。但是对于这个例子str 是完全可以接受的。
我想提一个使用用户定义文字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;
【讨论】:
通过构造函数传入:
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*
大多数答案都是关于构造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
【讨论】:
我一直在努力使用 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;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
【讨论】:
不知道为什么除了 Erik 之外没有人提到这一点,但根据 this page,赋值运算符工作得很好。无需使用构造函数、.assign() 或 .append()。
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
【讨论】:
=(和@ 987654325@)。像这样的文字似乎不会发生这种情况,而只是 char* 的事情。此类报告是否实际上泄漏的问题是discussed here。但是,如果我将分配更改为destString = std::string(srcCharPtr);,valgrind 泄漏报告就消失了。 YMMV。
Constructs an object of class basic_string and determines its initial string value from the array。它说的是价值,而没有关于缓冲区或指针所有权。
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
【讨论】:
如果您已经知道 char* 的大小,请改用它
char* data = ...;
int size = ...;
std::string myString(data, size);
这不使用 strlen。
编辑:如果字符串变量已经存在,使用assign():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
【讨论】:
我需要使用 std::string 来存储 fgets() 检索到的数据。
为什么在编写 C++ 时使用fgets()?为什么不std::getline()?
【讨论】:
char* data;
std::string myString(data);
【讨论】:
data 保持未初始化(空)。
data保持未初始化可能会导致std::string读取垃圾数据