4

我目前正在为我的班级写一个作业,该作业应该充当一个非常基本的外壳。我快完成了,但我遇到了一个问题,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*to const char* const。我读了一些关于的东西const_cast,但我不确定这是否是我需要做的。

如果你好心,你能帮我让我的字符数组数组被那个函数正确接受吗?如果您需要我发布更多代码,请告诉我。

谢谢

4

3 回答 3

1

问题是您不能将 const 变量传递给期望非常量参数的函数。

换句话说,const char *是 的子集char *

去除const

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

const_cast在此处添加

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

你的代码的其他部分看起来很可疑,但这会让它编译

于 2013-04-12T02:04:44.770 回答
0

创建 const 动态元素数组并不容易,有时不可能,因为所有元素都必须在初始化程序 {} 中声明。但幸运的是,您可以告诉编译器您传递的数组至少在一定时间内将是 const 的。您可以执行以下操作,这将产生

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

内部的 const_cast 将删除 std::string 所拥有的字符数组的常量性。因此,该函数很可能会更改 std::string 后面的字符数组的内容。当知道采用此类参数的函数的行为时,这可能没问题。

如果您想创建一个 char* 的 const 数组而不使用 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]));

希望这可以帮助。

于 2013-04-12T02:50:46.133 回答
0

没有任何 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);
于 2013-04-12T02:22:30.823 回答