如何将std :: string的值复制到char数组类型的结构成员中

时间:2017-09-06 20:38:05

标签: c++

说我有一个变量

std::string str; // initialized with some value

结构定义为:

struct test
    {
    public:
        const char* name;
    };

我知道可以做到这一点:

test t1;

t1.name = str.c_str();

但是这会将变量str的地址存储在t1.name

相反,我希望 str 的值放入结构的char数组成员中,该成员应该与变量str的完全相同的大小

有没有办法可以实现或更好的设计

提前致谢!

2 个答案:

答案 0 :(得分:0)

  

但是这会将变量str的地址存储在t1.name

不完全是。 DATEDIFF()不会返回变量str.c_str()的地址。它返回str所拥有的字符数组的地址。

  

相反,我希望str的值放入结构的数组成员

为此,结构必须具有str数组成员。你的结构没有;它有一个指针成员。

  

结构的char数组成员,其大小应与变量str完全相同。

这是不可能的。字符串的大小是动态的,即它可能在运行时改变。必须在编译时知道成员数组的大小。

您可以改为动态分配数组。顾名思义,动态分配的大小可以在运行时确定。但是,必须手动取消分配动态分配,否则程序将泄漏内存。

  

或更好的设计

动态分配的流行设计模式是RAII。标准库已经有一个用于字符串的RAII容器:char。因此,要将字符串复制到结构的成员中,一个好的设计是将字符串作为成员:

std::string

答案 1 :(得分:0)

没有理由使用const char *,因为它更容易出错且更难实现,您应该使用std::string

std::string还允许您使用const char *方法将c_str()变为字符串。

但是如果你必须将名称实现为C风格的字符串,那么你需要做的就是:

  • 使用new在堆上分配足够的空间。
  • 转换为非const
  • 使用strcpy
  • 复制字符串
  • 析构函数中的可用内存

构造

test(const std::string& str) : name(new char[str.length() + 1])
{
    strcpy((char*)name, str.c_str()); }
};

<强> [Live demo]

同样注意到@Pixelchemist ,还有重要的rules of zero/three/five。如果你的类包含没有正确复制/破坏的资源,那么就像纯指针不是一样(如果你使用智能指针,那将是不同的故事),你必须实现这些:

  • 复制构造函数
  • 复制分配操作员
  • 移动建筑师
  • 移动赋值运算符

对于扩展信息,请阅读this excellent answer about rule of three