我正在尝试从函数返回一个C字符串。该函数假设用逗号连接3个整数并将结果作为char数组返回,但是我得到了垃圾值。我假设我没有正确地调用malloc。有人可以就问题的原因提出建议吗?
using namespace std;
const char * createCommand(int p1, int p2, int p3){
stringstream sstm;
std::string comma = ",";
sstm << p1 << comma << p2 << comma << p3;
std::string str = sstm.str();
const char *cstr = (const char *)malloc( (str.length()+1) * sizeof (char));
cstr = str.c_str();
return cstr;
}
int main() {
const char *cstr2 = createCommand(1,0,250); //I want to return "1,0,250"
printf("char = %s\n",cstr2);
}
答案 0 :(得分:2)
由于其他两个答案已经回应了处理文字问题的问题,我将建议我考虑一个非常重要的设计缺陷导致你的问题:返回c字符串。
在您提供的示例代码中,完全使用c-strings是没有意义的。以下代码将实现您打算执行的操作,没有任何困难或有问题的代码:
std::string createCommand(int p1, int p2, int p3){
std::stringstream sstm;
std::string comma = ",";
sstm << p1 << comma << p2 << comma << p3;
return sstm.str();
}
int main() {
std::string command = createCommand(1,0,250); //I want to return "1,0,250"
std::cout << "char = " << command << "\n";
}
即使您只使用printf
而不是C ++ iostreams库,这个设计仍然更好:
std::string createCommand(int p1, int p2, int p3){
std::stringstream sstm;
std::string comma = ",";
sstm << p1 << comma << p2 << comma << p3;
return sstm.str();
}
int main() {
std::string command = createCommand(1,0,250); //I want to return "1,0,250"
printf("char = %s\n", command.c_str());
}
如果你需要将c-string传递给一些较旧的基于C的库,这个设计仍然可以满足要求。关键是,除了通过字符串本身之外,没有理由使用malloc
或与底层c字符串表示接口。
答案 1 :(得分:1)
对std::string
和其他对象起作用的赋值运算符不能覆盖指针。因此,分配
cstr = str.c_str();
泄漏已分配的内存,并用字符串中的数据替换指针。此外,函数现在返回的指针指向退出函数时失效的内存,除了泄漏外还会创建一个未定义的行为。
要解决此问题,请致电std::strcpy(cstr, str.c_str());
不要忘记在通话结果上拨打std::free
。 修改:您应该从const
函数的返回类型中删除createCommand
(WhozCraig,感谢您的评论)。
注意:我认为这只是使用malloc
的练习,您知道使用new[]
是首选,而且您不必这样做如果您可以从函数返回std::string
,则可以使用上述任何一项。
答案 2 :(得分:0)
在返回指针之前,您需要使用某种形式的strcpy
复制字符串。
const char * createCommand(int p1, int p2, int p3){
stringstream sstm;
std::string comma = ",";
sstm << p1 << comma << p2 << comma << p3;
std::string str = sstm.str();
const char *cstr = (const char *)malloc( (str.length()+1) * sizeof (char));
strcpy(cstr, str.c_str());
return cstr;
}