【问题标题】:C++ string char** translationC++ 字符串 char** 翻译
【发布时间】:2012-03-10 10:42:14
【问题描述】:

如何使用 char** 创建一个包含 n 个字符串的数组?

char** lit;
*lit = (char*)calloc(this->nr_param, sizeof(char*));
for(int i = 0; i < this->nr_param; i++)
      lit[i] = (char*) calloc(this->nr_param, sizeof(char));    

是这样吗? 如果是这样,我如何访问元素?假设我的数组将包含以下元素: aaab,阿巴,巴布;

我想要这个结构:

lit[0] = "aaab";
lit[1] = "abba";
lit[2] = "baab"; 

我如何声明它们没问题?

【问题讨论】:

  • 为什么?当然你应该使用vector&lt;string&gt;?至于Q中的代码,第一个calloc需要sizeof(char*)而不是sizeof(char),第二个calloc需要为字符串分配足够的空间,并且与nr_param无关。
  • 为什么需要字符串?你的代码中没有 c++ 字符串?
  • @Dementor 是什么让你认为vector&lt;string&gt; 不能做到这一点?
  • @Dementor:这是一个典型的例子,说明你一直在错误地学习 C++。 vector&lt;string&gt; 是迄今为止最好的解决方案,它的行为完全符合您的需要,但由于某种原因,您自欺欺人地认为 C++ 中需要指针(大多数情况下不需要)。
  • @Dementor:不不不,永远不要使用new。只需std::vector&lt;std::string&gt; lit;,就完成了。认真地忘记指针和new。这些是非常高级的小众主题,在您确信自己需要它们之前,您不应该需要它们。

标签: c++ string char calloc


【解决方案1】:

像这样:

// allocate memory for n char pointers dynamically.
char ** lit = static_cast<char**>(::operator new(n * sizeof(char*)));

for (unsigned int i = 0; i != n; ++i)
{
    lit[i] = static_cast<char*>(::operator new(length_of_string_i)); // #1
    // populate lit[i] with data
}

您需要一些方法来确定ith 字符串的长度,您需要将其适当地粘贴到标记为#1 的行中。注意sizeof(char) == 1,所以你不需要在内部分配中乘以任何东西。 (如果您愿意,可以使用std::malloc 而不是::operator new,但您必须使用#include &lt;cstdlib&gt;。)完成后不要忘记清理!

这当然只是你所要求的字面意思。在 C++ 中,您通常更喜欢 对象创建 而不是原始的内存分配,如下所示:

// construct n char pointers dynamically
char ** lit = new char*[n];

for (unsigned int i = 0; i != n; ++i)
{
    lit[i] = new char[length_of_string_i];
    // populate lit[i] with data
}

但是你绝对不应该使用array-new。这不是一个好的概念,也很少是好的 C++。

因此,您根本不应该这样做,而应该使用:

std::vector<std::string> lit(n);

【讨论】:

  • 值得注意的是length_of_string_i 需要为零终止符留出空间
  • 你能解释一下为什么你写new(n * sizeof(char*))而不是new char*[n]吗?
  • @MrLister:那不是我写的。我写了::operator new(n * sizeof(char*)),只是为了对应OP(可能是被误导的)要求的。 new char*[n] 做了不同的事情,至少在概念上是这样。
  • @KerrekSB 但是您的代码(复制并粘贴不变)无法在 g++ 4.6.1 下编译。
  • @MrLister:啊,是的,你需要一个演员表……这完全是丑陋和可怕的,我同意。
【解决方案2】:

你可以用类似的方式使用c++向量和字符串:

  #include <vector>
  #include <string>
  #include <iostream>
  int main() {
    std::vector<std::string> lit;
    lit.push_back("aaab");
    lit.push_back("aab");
    lit.push_back("aabb");
    lit[0][0] = 'z';
    std::cout << lit[0] << std::endl;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2014-06-08
    相关资源
    最近更新 更多