C ++ string char ** перевод - PullRequest
       7

C ++ string char ** перевод

0 голосов
/ 10 марта 2012

Как я могу сделать массив из n строк, используя char **?

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, abba, baab;

Мне нужна эта структура:

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

Это нормально, как я их объявил?

Ответы [ 2 ]

8 голосов
/ 10 марта 2012

Как это:

// 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
}

Вам нужен какой-то метод определения длины i -ой строки, который нужно правильно вставить в строку, помеченную # 1. Обратите внимание, что sizeof(char) == 1, поэтому вам не нужно ничего умножать во внутреннем распределении. (Вы можете использовать std::malloc вместо ::operator new, если хотите, но тогда вам нужно #include <cstdlib>.) Не забудьте очистить, когда вы закончите!

Это, конечно, только буквальный перевод того, что вы просили. В 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
}

Но вам никогда не следует серьезно использовать новый массив. Это не очень хорошая концепция и редко хороший C ++.

Итак, вам вообще не следует этого делать, и вместо этого вы должны использовать:

std::vector<std::string> lit(n);
2 голосов
/ 10 марта 2012

Вы можете использовать вектор и строки 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;
  }
...