C ++ const char * Const char * const

В настоящее время я пишу задание для моего класса, которое должно действовать как базовая оболочка. Я почти закончил, но у меня возникла проблема с execvp и мой массив символов персонажа. Вот небольшой фрагмент моего кода.

//Split the left content args
istringstream iss(left);
while(getline(iss, s, ' ')){
v.push_back(s);
}

//Get the split string and put it into array
const char* cmd_left[v.size()+1];
for(unsigned int i = 0; i < v.size(); i++){
cmd_left[i] = v.at(i).c_str();
}
cmd_left[v.size()] = 0;
v.clear();

И это используется …

execvp(cmd_left[0], cmd_left);

Моя ошибка

assign3.cxx:96:34: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive]

Я понимаю, что проблема в том, что мой массив символов не полон постоянных данных, поэтому мне нужно по существу перейти от const char* в const char* const, Я читал кое-что о const_cast, но я не был уверен, что это то, что мне нужно делать.

Если бы вы были так любезны, не могли бы вы помочь мне правильно воспринять мой массив массивов символов этой функцией? Если вам нужно, чтобы я опубликовал больше моего кода, дайте мне знать.

Спасибо

4

Решение

Проблема в том, что вы не можете передать константную переменную в функцию, ожидающую неконстантного аргумента.

другое слово, const char * это подмножество char *,

удалить const

/*const*/ char* cmd_left[v.size()+1];

добавлять const_cast Вот

cmd_left[i] = const_cast<char *>( v.at(i).c_str() );

другие части вашего кода выглядят подозрительно, но это заставит его скомпилироваться

1

Другие решения

Без каких-либо const_cast:

istringstream iss(left);
while(getline(iss, s, ' ')){
v.push_back(s);
}

//assuming v is not empty! which you were already
string command = v[0]; //store the command in a separate variable (this makes a copy of the string)

char* cmd_left[v.size()+1]; //not a (const char)*
for(unsigned int i = 0; i < v.size(); i++){
cmd_left[i] = new char[v[i].size()+1];
strcpy(cmd_left[i], v[i].c_str()); //copy contents of each string onto a new buffer
}
cmd_left[v.size()] = NULL;

v.clear(); //if you really want to; not necessary from the code you posted

//...
execvp(command.c_str(), cmd_left);
0

Это нелегко, иногда невозможно создать константный динамический массив элементов, потому что все элементы должны быть объявлены в инициализаторе {}.
Но, к счастью, вы можете сказать компилятору, что передаваемый массив будет постоянным, по крайней мере, в течение определенной продолжительности. Вы могли бы сделать следующее это даст

&((char* const) (const_cast<char*>(cmd_left[0]) ))

Внутри const_cast удаляет константу массива символов, которым владеет std :: string. Таким образом, вполне возможно, что функция может изменить содержимое массива символов за спиной std :: string. Когда поведение функций, принимающих такой аргумент, известно, это может быть нормально.

Если вы хотите создать массив const char * без обращения к const_cast или управления памятью с помощью new / delete, вы можете использовать std :: vector> вместо вектора строк.

istringstream iss(left);
while(getline(iss, s, ' ')){
v.push_back(std::vector<char>(s.length()+1));
strcpy(&v.back().front(),s.c_str());
}

//Get the split string and put it into array
char* cmd_left[v.size()+1];
for(unsigned int i = 0; i < v.size(); i++){
cmd_left[i] = &v.at(i).front();
}
cmd_left[v.size()] = 0;
v.clear();
execvp(cmd_left[0], &((char* const)cmd_left[0]));

Надеюсь это поможет.

0
По вопросам рекламы [email protected]