Если у меня есть вектор строк, как я могу использовать строки с execvp для выполнения команды?

Я работаю над заданием, в котором я создаю свою собственную командную оболочку. Я правильно разложил свою входную строку на несколько строк. Я пытаюсь выяснить, как использовать эти строки с execvp.

Идея в том, что если у меня есть такой вектор:

vector<string> s;
s[0] = "ls";
s[1] = "-a";
s[2] = "-l";

Я хочу иметь возможность запустить команду ls -a -l используя execvp.

Я думал об использовании c_str() конвертировать мои строки в const char *потому что я думал, что execvp принимает в const char *, но это не сработало для меня.

Как я должен это делать?

Спасибо всем за помощь и отзывы! Действительно ценю это.

0

Решение

с помощью execvp Вы хотите массив char* указатели в качестве второго аргумента. Я бы пошел об этом так:

  1. создать ваши варианты
  2. сделать вектор из указателей
  3. напрямую использовать векторные данные

Код является:

char cmd[] = "ls";
char p1[] = "-l";
char p2[] = "-a";

vector<char*> parameters;

parameters.push_back(p1);
parameters.push_back(p2);execvp(cmd, parameters.data());

Вы можете использовать только std::vector::data() если компилятор c + 11 доступен с std::vector::data() это особенность C ++ 11. Чтобы использовать компилятор c + 11, добавьте -std=c++11 к вашим вариантам компиляции.

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

0

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

Я думаю, что я понял это.

Я создал функцию, которая принимает вектор strings в качестве входа и выхода вектора char *,

vector<char *> stringToChar(vector<string> s){
vector<char *> c;

for(int i = 0; i < s.size(); ++i){
char *str;
str = new char[s[i].size() + 1];
memcpy(str, s[i].c_str(), s[i].size() + 1);

c.push_back(str);
}
return c;
}
0

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