【问题标题】:How to use an array of string in c++?如何在 C++ 中使用字符串数组?
【发布时间】:2020-11-27 15:04:21
【问题描述】:

我需要创建一个字符串数组,我可以在其中存储 3 或 5 个单词,例如 {"banana, peach, pear"} 或 {"orange", "pear", "silantro", "ginger", "普通话”}。

我很困惑是否应该创建一个字符串指针数组(根据数组 3 或 5 的大小动态分配内存),还是只创建一个静态分配内存为 5 的字符串数组。以及如何初始化它/将其设置为 null/在构造函数中使用它。

我不允许使用矢量。 当我声明一个大小为 5 的数组时,问题从默认构造函数开始。 我不知道如何将其设置为空... // 字符串 multiple_fruits[5]
// multiple_fruits[] = { nullptr, };

所以我在这里使用了一个字符串指针数组,有没有更好的方法? 我究竟做错了什么??哈哈

//.h file
class Fruit {
  char* single_fruit;
  string* multiple_fruits;
  int num_Fruits;
};
 

//.cpp file
Fruit::Fruit() {
  single_fruit = nullptr;
  multiple_fruits = nullptr;
  num_Fruits = 0;
}
 
Fruit::Fruit(const char* singlefruit, string* multiplefruits, int numFruits) {
  single_fruit = new char[strlen(singlefruit) + 1];
  strcpy_s(single_fruit, strlen(singlefruit) + 1, singlefruit);
 
  multiple_fruits = new string[numFruits];

  for (int i = 0; i < numFruits; i++) {
    multiple_fruits[i] = multiplefruits[i];
  }
  num_fruits = numFruits;
}
 
int main() {
  Fruit A;
  A("apple", {"banana", "peach", "pear"}, 3)
  Fruit B;
  B("lemon", {"orange", "pear", "silantro", "ginger", "mandarine"}, 5);
return 0;
}

【问题讨论】:

  • @TedLyngmo 哦,我只是想让它加粗,但现在我删除了**。一个 char 数组只能存储 1 个单词,但我需要创建一个数组来存储多个单词。我该怎么做?
  • 为什么要声明一个string 指针数组? string* multiple_fruits[5];
  • 是否允许使用string?如果是,则将其用于single_truit
  • 有理由使用 c 字符串吗? C++ 支持stringsarrays
  • @TedLyngmo 因为老实说我只熟悉 char 并且我不知道要创建什么大声笑...有更好的方法吗???

标签: c++ arrays string pointers


【解决方案1】:

这是向构造函数正确声明数组参数的一种方法。

#include <algorithm> // std::copy
#include <iterator>  // std::begin, std::end
#include <string>
#include <iostream>

template<size_t N>
class Fruit {
public:
    Fruit();
    Fruit(const std::string& singlefruit, const std::string (&multiplefruits)[N]);
    
    size_t size() const;

private:
    std::string single_fruit;
    std::string multiple_fruits[N];
};

template<size_t N>
Fruit<N>::Fruit() {}

template<size_t N>
Fruit<N>::Fruit(const std::string& singlefruit, const std::string (&multiplefruits)[N]) 
    : // colon indicates the start of the member initializer list
    single_fruit(singlefruit)
{
    std::copy(std::begin(multiplefruits), std::end(multiplefruits), multiple_fruits);
}

template<size_t N>
size_t Fruit<N>::size() const { return N; }

int main() {
    Fruit A("apple", {"banana", "peach", "pear"});
    std::cout << A.size() << '\n';

    Fruit B("lemon", {"orange", "pear", "silantro", "ginger", "mandarine"});
    std::cout << B.size() << '\n';
}

输出:

3
5

【讨论】:

    【解决方案2】:

    我的方法是为此使用std::stringstd::initializer_list

    #include <string>
    #include <initializer_list>
    
    class Fruit {
    public:
      Fruit(const std::string &singlefruit, const std::initializer_list<std::string> &multiplefruits) : single_fruit{singlefruit}, multiple_fruits{new std::string[multiplefruits.size()]}, num_Fruits{multiplefruits.size()} {
        for (std::size_t i = 0; i < num_Fruits; ++i) {
          multiple_fruits[i] = *(multiplefruits.begin() + i);
        }
      }
      ~Fruit() {
        delete[] multiple_fruits;
      }
    private:
      std::string single_fruit;
      std::string *multiple_fruits;
      std::size_t num_Fruits;
    };
    
    int main() {
      Fruit A("apple", {"banana", "peach", "pear"});
      Fruit B("lemon", {"orange", "pear", "silantro", "ginger", "mandarine"});
    }
    

    我为元素分配了内存,并在析构函数中删除了内存。

    你不能在一行声明一个变量,然后在下一行调用构造函数。

    【讨论】:

    • 谢谢托马斯!我会消化这个:0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多