如何将char *复制到字符串中,反之亦然

时间:2010-04-01 22:19:36

标签: c++

如果我将char *传递给函数。我想把那个char *转换为std :: string,一旦我得到我的结果,就从std :: string将它转换回char *来显示结果。

  1. 我不知道怎么做转换(我不是说const char *而只是char *)
  2. 我不知道如何操纵我发送的指针的值。
  3. 所以我需要做的步骤

    1. 接受char *
    2. 将其转换为字符串。
    3. 获取该字符串的结果并以char *
    4. 的形式将其放回
    5. 返回结果,使得该值应该在函数外部可用而不会被破坏。
    6. 如果可能的话,我可以通过引用vs一个指针来看它是如何完成的(它的地址我通过值传入但是我仍然可以修改指针指向的值。所以即使指针地址的副本在函数被破坏我仍然看到外面改变的值。

      谢谢!

3 个答案:

答案 0 :(得分:43)

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>而不是实际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];

答案 1 :(得分:1)

您需要观察从返回的指针处理内存的方式,例如下面的代码将无效,因为当fn()退出时,std :: string中分配的内存将被释放。

const char* fn(const char*psz) {
    std::string s(psz);
    // do something with s
    return s.c_str();   //BAD
}

一种解决方案是在函数中分配内存并确保函数的调用者释放它:

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)

答案 2 :(得分:0)

您可以为您的库维护一个垃圾收集器 std::vector<char*> g_gc;可在您的库'lib'中访问。稍后,您可以通过调用lib::release_garbage();

在方便时释放g_gc中的所有指针
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;
}

release_garbage函数将如下所示:

void lib::release_garbage()
{
   for(int i=0;i<g_gc.size();i++)
   {
       delete g_gc[i];
   }
   g_gc.clear();
}

在单线程模型中,您可以将此g_gc保持为静态。多线程模型将涉及锁定/解锁它。