我试图通过将字符串转换为字符串来将char *添加到char *的向量中。以下是我使用的代码:
vector<char*> actionLog;
// lots of code
int value = ...
// lots of code
string str = "string";
cout << str << value << endl;
str += std::to_string(player->scrap);
actionLog.push_back(str.c_str());
问题是我得到了指定的&#34;使用&amp;创建指向成员的指针&#34; push_back行的错误。 str.c_str应该返回一个char *,它是actionLog使用的类型。关于c_str如何工作或者做错其他事情我都不正确。推动行动日志
actionLog.push_back("something");
工作正常,但不是我提到的。我做错了什么?
编辑:我实际上是使用c_str()作为函数,我只是错误地复制了它
答案 0 :(得分:5)
您尝试做的事实上存在几个问题。
c_str
是功能成员。您必须使用()
:str.c_str()
。c_str()
会返回const char*
,因此您无法将其存储在vector<char*>
中。这样你就无法通过改变它内部的方式来打破std::string
。c_str()
的结果。只有在对const
进行非std::string
操作之前,它才有效。即如果您对std::string
的内容进行了更改,请尝试使用vector
中的相应元素,Undefined Behaviour!从您展示示例的方式来看,string
的生命周期看起来比vector
的生命周期短得多,因此vector
会指向某个甚至不再存在。也许最好只使用std::vector<std::string>
。如果您在此之后不再需要原始string
,则您甚至可以将其std::move
加入vector
,并避免额外复制。
顺便说一句,请重新考虑您对通常被视为不良做法的使用:using namespace std;
和endl
(这些是解释的链接)。后者有点争议,但至少理解为什么并做出明智的决定。
答案 1 :(得分:2)
std::basic_string::c_str()
是成员函数,而不是数据成员 - 您需要使用()
调用它。
正确的代码是:
actionLog.push_back(str.c_str());
请注意,std::basic_string::c_str()
会返回指向const char
的指针 - 您的actionLog
向量应为std::vector<const char*>
类型。
答案 2 :(得分:1)
维托里奥的回答告诉你你在细节上做错了什么。但我认为,你所做错的事情首先是使用vector<char*>
而不是vector<string>
。
使用指针向量,你必须担心底层字符串的生命周期,关于它们失效,从你下面改变,等等。名称actionLog
表明该事物是长寿的,并且您用来添加它的代码表明str
是用于构建日志字符串的本地帮助器变量,而不是其他任何内容。当str
超出范围时,向量包含一个悬空指针。
将矢量更改为vector<string>
,执行actionLog.push_back(str)
,不要担心生命或失效。
答案 3 :(得分:0)
您忘了()
,c_str是一个方法,而不是数据成员。只需写下actionLog.push_back(str.c_str());