复制const char*

Ily*_*ski 12 c++ string char

我从一个函数接收一个c-string作为参数,但我收到的参数将在以后销毁.所以我想复制一份.

这就是我的意思:

class MyClass
{
private:
 const char *filename;

public:
 void func (const char *_filename);
}

void MyClass::func (const char *_filename)
{
 filename = _filename; //This isn't going to work
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的不是简单地将一个内存地址分配给另一个,而是复制内容.我希望文件名为"const char*"而不是"char*".

我试图使用strcpy,但它要求目标字符串是非const.

有办法吗?没有在文件名上使用const_cast的东西?

谢谢.

Pon*_*gge 26

使用a std::string复制值,因为您已经在使用C++.如果您需要const char*,请使用c_str().

class MyClass
{
private:
    std::string filename;
public:
    void setFilename(const char *source)
    {
        filename = std::string(source);
    }

    const char *getRawFileName() const
    {
        return filename.c_str();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 隐含的转换永远不会"更好". (8认同)
  • 更好的是,使用隐式转换:filename = source; (7认同)
  • 它实际上不是转换,因为字符串对于char const*而言op =重载,但它仍然大约好13倍. (4认同)

Tad*_*pec 7

我同意最好的事情(至少在不了解你的问题的情况下)是使用std::string.但如果你坚持自己管理内存,你必须完全管理它.所以C++方式:

class MyClass
{
private:
 const char *filename;

 MyClass(const MyClass&); // no implementation
 MyClass operator=(const MyClass &); // no implementation

public:
 MyClass() {filename = 0;}
 ~MyClass() {delete[] filename;}

 void func (const char *_filename);
}

void MyClass::func (const char *_filename)
{
 const size_t len = strlen(_filename);
 char * tmp_filename = new char[len + 1];
 strncpy(tmp_filename, _filename, len);
 tmp_filename[len] = '\0'; // I'm paranoid, maybe someone has changed something in _filename :-)
 delete[] filename;
 filename = tmp_filename;
}
Run Code Online (Sandbox Code Playgroud)

和C方式

class MyClass
{
private:
 const char *filename;

 MyClass(const MyClass&); // no implementation
 MyClass operator=(const MyClass &); // no implementation

public:
 MyClass() {filename = 0;}
 ~MyClass() {free(filename);}

 void func (const char *_filename);
}

void MyClass::func (const char *_filename)
{
 free(filename);
 filename = strdup(_filename); // easier than C++, isn't it?
}
Run Code Online (Sandbox Code Playgroud)