实际上我遇到了将单个字符串保存到字符串*的问题。我有这样的功能:
void save(std::string* x, const std::string& file);
实际上我正在使用循环从文件中取出每个数字并将其分配给char ch;
所以,问题是如何将此char附加到字符串*?如果我创建临时字符串并将每个符号添加到此字符串中,然后执行strcpy
或仅x = temp
,我就会出现分段错误。
你能告诉我如何处理这件事吗?
谢谢。
答案 0 :(得分:1)
你永远不应该直接改变std :: string的缓冲区,因为它有自己的内存管理方法。
相反,您应该使用append()
方法:
char temp;
//...
if(x) //check for nullptr
{
x->append(1, temp); //appends the char 'temp' once
}
答案 1 :(得分:0)
听起来你正在创建一个本地字符串,然后将其分配给x
- 就像这样:
std::string temp;
// Add to temp
// ...
x = &temp;
问题在于,x
实际上是一个输出参数,您可以将其分配给本地。当函数超出范围时,本地(temp
)将被销毁,x
现在将指向被破坏的内存区域。这将使您违反访问权限。
您最好的选择是更改save
,以便返回字符串。像这样:
std::string save(const std::string &file)
{
std::string temp;
// Do stuff...
return temp;
}
现在,字符串将被正确复制(或移动,如果你是C ++ 11)回到调用者。您可以使用push_back
将字符附加到temp
。
如果您不想返回字符串,请将引用传递给用户提供的字符串并填写:
void save(std::string &x, const std::string &file)
{
char temp;
x.push_back(temp);
}
然后像这样调用它:
std::string output;
save(output, "path/to/my/file);