gpt4 book ai didi

c++ - 将字符串转换为 char*

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:57 24 4
gpt4 key购买 nike

我正在尝试编写一个将 std::string 转换为 char* 的函数。我写的第一个是这样的:

char* $ (string str)
{
char* cstr;
const unsigned int length=str.size();
cstr=new char[1000];
for(int i=0;i<length;i++)
cstr[i]=str[i];
cstr[length]=0;
return cstr;
}

但问题是内存泄漏:假设我这样做:

char* cstr;
string str1("hello"),str2("hello2");
cstr=$(str1);
cstr=$(str2);

在这种情况下存在内存泄漏。无法访问第一个分配的字符串,但它的引用丢失了。所以我使用 static 做了同样的事情:

char* $ (string str)
{
static char cstr[1000];
const unsigned int length=str.size();
for(int i=0;i<length;i++)
cstr[i]=str[i];
cstr[length]=0;
return cstr;
}

但现在的问题是静态字符字段是可访问的:

char* cstr;
string str("hello");
cstr=$(str);
$(str)[5]='!';

这是可能的,第 6 个字符被修改,因此 cstr 指向的 C 风格字符串也被修改。

使用常量:

const char* $ (string str)
{
static char cstr[1000];
const unsigned int length=str.size();
for(int i=0;i<length;i++)
cstr[i]=str[i];
cstr[length]=0;
return cstr;
}

问题是 char 指针与 const char 指针不兼容,所以我不能这样做:

string str("hello");
char* cstr;
cstr=$(str);

但是我只能使用一个const char指针。我要做的是拥有一个函数,其返回值只能作为右操作数,而不能作为赋值的左操作数。这怎么能做到呢?

我试着这样做:

char* toCharArray(string& str)
{
std::unique_ptr<char>p(new char[1000]);
char* temp=p.get();
for(unsigned int i=0;i<str.size();i++)
{
*temp=str[i];
temp++;
}
return p.get();
}

但问题仍然存在,我看不出这个和我使用静态发布的其他解决方案之间的区别。因为这样的代码:

char* cstr;
string str("hello");
cstr=toCharArray(str);
toCharArray(str)[0]='o';
cout << cstr;

修改字符串(打印“oello”)。问题仍未解决。

最佳答案

您可以通过将分配的数组返回为 std::unique_ptr<char[]> 来防止内存泄漏或 std::vector<char> ;如果它们被重新分配或超出范围,它们都将释放内存。

你可以得到一个char*指向内容的指针 ptr.get()&vec[0]分别。

顺便说一句,既然长度是已知的,那么数组长度确实应该是length+1 , 不是 1000 .固定大小的缓冲区是等待发生的溢出。另外,$不是函数的可移植名称。

关于c++ - 将字符串转换为 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com