Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将char*复制到字符串中,反之亦然_C++ - Fatal编程技术网

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

C++ 如何将char*复制到字符串中,反之亦然,c++,C++,如果我将char*传递给函数。然后我想把这个char*转换成std::string,一旦得到结果,就把它从std::string转换回char*,以显示结果 我不知道如何进行转换(我不是说const char*,只是char*) 我不知道如何操作我发送的指针的值 所以我需要做些什么 接收字符* 将其转换为字符串 获取该字符串的结果,并将其以字符的形式放回原处* 返回结果,使该值在函数外部可用,并且不会被销毁 如果可能的话,我可以看看如何通过引用与指针(我通过值传入了指针的地址)进行比较,但是我仍

如果我将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();
    }