C++ 如何将char*复制到字符串中,反之亦然
如果我将char*传递给函数。然后我想把这个char*转换成std::string,一旦得到结果,就把它从std::string转换回char*,以显示结果C++ 如何将char*复制到字符串中,反之亦然,c++,C++,如果我将char*传递给函数。然后我想把这个char*转换成std::string,一旦得到结果,就把它从std::string转换回char*,以显示结果 我不知道如何进行转换(我不是说const char*,只是char*) 我不知道如何操作我发送的指针的值 所以我需要做些什么 接收字符* 将其转换为字符串 获取该字符串的结果,并将其以字符的形式放回原处* 返回结果,使该值在函数外部可用,并且不会被销毁 如果可能的话,我可以看看如何通过引用与指针(我通过值传入了指针的地址)进行比较,但是我仍
谢谢!将
char*
转换为std::string
:
char* c = "Hello, world";
std::string s(c);
将std::string
转换为char*
:
std::string s = "Hello, world";
char* c = new char[s.length() + 1];
strcpy(c, s.c_str());
// and then later on, when you are done with the `char*`:
delete[] c;
我更喜欢使用std::vector
而不是实际的char*
;这样您就不必管理自己的内存:
std::string s = "Hello, world";
std::vector<char> v(s.begin(), s.end());
v.push_back('\0'); // Make sure we are null-terminated
char* c = &v[0];
std::string s=“你好,世界”;
向量v(s.begin(),s.end());
v、 向后推('\0');//确保以null结尾
char*c=&v[0];
您需要观察如何从返回的指针处理内存,例如,下面的代码将不起作用,因为在std::string中分配的内存将在fn()退出时释放
一种解决方案是在函数中分配内存,并确保函数的调用者释放它:
const char* fn(const char*psz) {
std::string s(psz);
// do something with s
char *ret = new char[s.size()]; //memory allocated
strcpy(ret, s.c_str());
return ret;
}
....
const char* p = fn("some text");
//do something with p
delete[] p;// release the array of chars
或者,如果您知道字符串大小的上限,您可以自己在堆栈上创建它并传入指针,例如
void fn(const char*in size_t bufsize, char* out) {
std::string s(psz);
// do something with s
strcpy_s(out, bufsize, s.c_str()); //strcpy_s is a microsoft specific safe str copy
}
....
const int BUFSIZE = 100;
char str[BUFSIZE];
fn("some text", BUFSIZE, str);
//ok to use str (memory gets deleted when it goes out of scope)
您可以为实现为的库维护一个垃圾收集器
std::vector g_gc;
可在库“lib”中访问。稍后,您可以通过调用lib::release_garbage();
release\u垃圾函数将如下所示:
void lib::release_garbage()
{
for(int i=0;i<g_gc.size();i++)
{
delete g_gc[i];
}
g_gc.clear();
}
void lib::release\u垃圾()
{
对于(int i=0;i)“将其从std::string转换回char*,以显示结果。”-当结果是字符串时,为什么不能显示结果?应该能够执行std::cout这是我必须使用的接口。因此,尽管我尽可能使用字符串,但如果接口需要char*,那么这就是我必须使用的。函数输出参数是char*…这是我在这种情况下必须使用的,接口应该说关于内存管理。我之所以说“应该”,是因为它可能不是——一些接口的指定很差,这是事实。无论何时从函数返回指针,都需要说明谁负责分配指向的数据、数据保持有效的时间,以及谁负责释放数据(如果适用)。如果你能解决这个问题,你就可以找到如何返回一个合适的指针值。好吧,我正在编写一个测试应用程序,它将为指针分配内存(因此,无论谁使用接口,都将是管理指针的人)。我的实际函数将只接收2个参数,其中一个需要返回char*值。因此,我是本着测试我要发送的lib的精神来执行此操作的。是的,但在后一种情况下,当使用c_str()时,它返回的是常量char*而不是char*@user295030:c_str()
确实返回一个const char*
;strcpy
(源字符串)的第二个参数的类型是const char*
。如果您只需要const char*
,则无需执行此操作,只需使用c_str()
的结果即可返回一个常量char*,这就是他将其复制到名为c的char*中的原因。在函数中,您将返回c。如果您在堆栈上声明了c数组,您也不必管理内存。@wilhelmtell:是的,但这违反了OP的一项要求(“返回结果,使该值在函数外部可用且不会被销毁”)。它还有一个缺点,就是您必须在编译时猜测它需要有多大。通常这是可以的,但有时不是。这是非常危险的;将裸指针存储在容器中几乎总是一个坏主意,因为很难确保异常安全。(请参阅此处了解替代方法:)。此外,您的答案中的代码有一个严重的错误:它使用了不匹配的new[]
和delete
。这是一个很好的线程。感谢您指出delete[]。有了它,您甚至不能“垃圾收集”“按需,因为某些指针可能正在使用。您只能在应用程序退出时安全地执行此操作,这使得它毫无用处,因为在应用程序退出时,分配的内存会被释放。”。
char* lib::func(char*pStr)
{
std::string str(pStr);
char *outStr = new char[str.size()+1];
strcpy(outStr, str.c_str());
g_gc.push_back(outStr); // collect garbage
return outStr;
}
void lib::release_garbage()
{
for(int i=0;i<g_gc.size();i++)
{
delete g_gc[i];
}
g_gc.clear();
}