Не получается изменить массив char

Рейтинг: 0Ответов: 3Опубликовано: 15.03.2023

Код:

char** n = new char*[2];
n[1] = "ll";  // без этого след строка работает
n[1] = "k";
n[0] = "klk";
// n[0][1]='s'; тоже ошибка

cout << n << " " << n[0] << " " << n[0][1] << endl;

Ошибка:

does not allow conversion from string literal to 'char *'

Почему вылетает такая ошибка? По факту я просто хочу переименовать элемент массива.

Ответы

▲ 3

У Вас n это указатель на указатель, следовательно, Вам надо выделить память для каждого n[i]. То есть n[0] = new char[size]; n[1] = new char[size]; а потом можете заполнить n[i] строками

▲ 2

Если вы планируете просто хранить массив строковых литералов, то можно просто добавить const:

const char** n = new const char*[2];
n[1] = "ll";  // без этого след строка работает
n[1] = "k";
n[0] = "klk";

cout << n << " " << n[0] << " " << n[0][1] << endl;

Но вот изменять строковые литералы нельзя, так что

n[0][1]='s';

так ошибкой и останется. Если вы хотите хранить копии литералов с правом их изменения — надо выделять место для них и копировать.

Но я бы в этом случае рекомендовал работать со строками string, и не массивами, а векторами.

Ведь у вас же С++, как-никак...

▲ -1

Строковые литералы в C++ всегда являются константами, поэтому надо привести const char* ко char*:

#include <iostream>

int main()
{
    char** a = new char*[3];
    a[0] = (char*) "abc";
    a[1] = (char*) "def";
    a[2] = (char*) "ghi";
    for (size_t i = 0; i < 3; ++i)
    {
        std::cout << "a[" << i << "] = " << a[i] << "\n";
    }
    delete[] a;
    return 0;
}
a[0] = abc
a[1] = def
a[2] = ghi