将char*转换为std::string

363

我需要使用std::string来存储由fgets()检索的数据。为此,我需要将fgets()char * 返回值转换为std::string,以存储在数组中。如何实现这一点?

13个回答

3
char* c1 = 'z';
char* c2 = 'w';
string s1{c1};
string s12{c1, c2};

问题是关于将 char* 转换为 std::string。你的代码中 char* 在哪里? - Adrian Mole
哦,对不起,你是正确的。我改了它,谢谢。 - payam purchi
1
但是现在你的代码有问题了... const char* c1 = "z"; 可能吗? - Adrian Mole
我测试了一下,它工作正常。 - payam purchi
2
真的吗?当我尝试编译你的代码时,出现了以下错误:**错误:无法使用'type 'char *'的rvalue初始化变量'type 'char''**。 - Adrian Mole
哦...那么请测试这个 => const char* c1 = "z"; - payam purchi

2
char* data;
std::string myString(data);

10
这将导致未定义行为。 - anon
2
仅有这两行代码,data 仍然未初始化(为空)。 - heltonbiker
1
如果没有提供指针的真正“长度”,这段代码可能会导致数据丢失,您的std::string将比原始char *“更短”。 - Andiana
data 未初始化可能会导致 std::string 读取垃圾数据。 - Fox

1

不确定为什么除了 Erik 以外没有人提到这一点,但根据 this page,赋值运算符可以正常工作。不需要使用构造函数、.assign() 或 .append()。

std::string mystring;
mystring = "This is a test!";   // Assign C string to std:string directly
std::cout << mystring << '\n';

2
它在功能上似乎是有效的,但当我这样做时,Valgrind开始报告可达块问题,这些问题源自于=(和+=)内部的“new”。这似乎不会发生在像这样的文字中,而只会发生在char*之类的东西中。这些报告是否实际泄漏在此处讨论。但如果我将分配更改为destString = std::string(srcCharPtr);,则valgrind泄漏报告就消失了。你的情况可能有所不同。 - HostileFork says dont trust SE
HostileFork的评论可能会让你认为从char*(例如从fgets)构造字符串将使std::string管理此内存的生命周期。然而,事实并非如此。 请参见标准21.4.2.7和.9“构造basic_string类的对象,并从数组确定其初始字符串值”。它说的是值,没有涉及缓冲区或指针所有权。 - Erik van Velzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接