【问题标题】:Dynamic array of fixed length strings固定长度字符串的动态数组
【发布时间】:2021-01-28 13:47:05
【问题描述】:

如何创建固定长度字符串的动态数组?

我创建了类 AString,它具有指向结构 _str 的指针,该结构具有固定长度的数组 data

如何赋值,有什么问题?

#include "stdafx.h"
#include <iostream>

struct _str {
    char data[20];
};

class AString {
public:
    AString();
    ~AString();
    void Add(_str string);
private:
    _str *str;
    int count;
};

AString::AString() {
    std::cout << "Constructor" << std::endl;
    str = nullptr;
    count = 0;
}

AString::~AString() {
    std::cout << "Destructor" << std::endl;
    if (str != nullptr) delete[] str;
}

void AString::Add(_str string) {
    _str *str2 = new _str[count+1];
    for (int i=0;i<count;i++) {
        str2[i] = str[i];
    }
    delete[] str;
    str = str2;
    count++;
    str[count-1] = string;
}

int _tmain(int argc, _TCHAR* argv[])
{
    AString astring;
    _str str1;
    str1.data="0123456789012345678"; // cannot convert from 'const char[20]' to 'char[20]'
    astring.Add(str1);
    std::cin.get();
    return 0;
}

str1.data="0123456789012345678";: 无法从 'const char[20]' 转换为 'char[20]'

想要: 不使用_str str1;,使用char str1[20];

【问题讨论】:

  • AStrring 需要一个指向可以更改的数组的指针,但不能更改字符串文字。您必须决定是否要使用字面量的存储,但将 AString 转换为不可变类型,或者是否要将字符串字面量复制到可修改的数组中。
  • 这能回答你的问题吗? Assigning value to char array
  • 您的逻辑有误。你的析构函数delete[]s 指向的数组,但你从来没有new[] 一个数组。
  • “动态数组”在 C++ 中拼写为“std::vector”。
  • 为什么不使用std::array&lt;char, 20&gt;

标签: c++


【解决方案1】:

至于我,我用这个:

   strcpy(str1.data, "0123456789012345678");

这里是主要的:

int main(int argc, char* argv[])
{
    AString astring;
    _str str1;
    //str1.data=const_cast<char>("0123456789012345678"); // cannot convert from 'const char[20]' to 'char[20]'
    strcpy(str1.data, "0123456789012345678");
    astring.Add(str1);

    std::cout << str1.data;
    std::cin.get();
    return 0;
}

结果如下:

Constructor
0123456789012345678

【讨论】:

    【解决方案2】:

    首先,我建议你使用std::stringstd::array。但是如果你强制使用 char[],我会建议你使用 strncpy 而不是 operator =,所以它看起来像这样

    strncpy(str1.data,"0123456789012345678", 20); // cannot convert from 'const char[20]' to 'char[20]'
    

    【讨论】:

      【解决方案3】:

      要复制char*或内存块,最好使用memcpy

      void* memcpy (void* destination, const void* source, size_t length);
      

      它将长度字节的值从源指向的位置直接复制到目标指向的内存块。请注意,源指针和目标指针所指向的对象的底层类型并不重要。

      您也可以使用strncpy

      char* strncpy(char* destination, const char* source, size_t length);
      

      它适用于您的代码,但如果有一些 0 值字节,则 strncpy 将其视为 null-termination 并继续处理“0”,即 (pad) 直到满足长度。

      试试

      memcpy(str1.data, "0123456789012345678", 20);
      

      【讨论】:

        【解决方案4】:

        您不能分配给数组 - 就是这样。
        您可以在main 中使用strncpy,或者使用std::array&lt;char, 20&gt; 获取可分配数组,但如果需要手动执行此操作,我会添加构造函数(并隐藏实现细节)以确保安全:

        class _str {
          public:
            typedef char base[20];
            _str() { data[0] = 0; }
            _str(const base& in) { strncpy(data, in, 20); }
            const base& get() const { return data; }
         private:
            base data;
        };
        

        然后你就可以了

        AString astring;
        _str str1 = "01234567890123456789"; // Fine
        astring.Add(str1);
        std::cout << str1.get();
        _str str2 = "012345678901234567890"; // Compilation error
        _str str3 = "0"; // Compilation error
        

        【讨论】:

        • 嗨,我收到错误:'base': symbol cannot be used in a using-declaration
        • 如果你使用的是非常老的C++版本,比如C++03,你需要typedef char base[20];
        • 我正在使用 Visual Studio 2012。在 base data = {} 上出现错误:不允许使用数据成员初始化程序
        • @jsmith 我已将答案更新为旧版本。
        • 是否可以创建任意长度的字符串数组?将“20”移动到构造函数参数
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多