简体   繁体   English

C ++ const char * to const char * const

[英]C++ const char* To const char* const

I am currently writing an assignment for my class that is supposed to act as a very basic shell. 我目前正在为我的班级写一个作为一个非常基本的shell的作业。 I am nearly finished, but I am running into an issue with execvp and my character array of parameters. 我差不多完成了,但是我遇到了execvp和我的参数字符数组的问题。 Here is a light snippet of my code. 这是我的代码的轻量级片段。

//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();

And this is utilized by... 这被......用了

execvp(cmd_left[0], cmd_left);

My error is 我的错误是

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

I understand that the problem is that my character array isn't full of constant data, so I need to essentially go from const char* to const char* const . 我知道问题是我的字符数组没有充满常量数据,所以我需要从const char*const char* const I read something about const_cast , but I wasn't sure if that is what I need to be doing. 我读了一些关于const_cast ,但我不确定这是否是我需要做的。

If you would be so kind, could you help me get my array of character arrays to be properly accepted by that function? 如果你会这么善良,你能帮助我让我的数组字符数组被该函数正确接受吗? If you need me to post more of my code, let me know. 如果您需要我发布更多我的代码,请告诉我。

Thanks 谢谢

The problem is you cannot pass const variable to function expecting non-const argument. 问题是你不能将const变量传递给期望非const参数的函数。

other word, const char * is a subset of char * . 换句话说, const char *的一个子集char *

remove the const 删除const

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

add const_cast here 在这里添加const_cast

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

other parts of your code look suspicious, but this will make it compile 代码的其他部分看起来很可疑,但这会使它编译

Without any const_cast: 没有任何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);

It is not easy, sometimes not possible to create a const dynamic array of elements because all the elements have to declared within the initializer {}. 要创建一个const动态元素数组并不容易,因为所有元素都必须在初始化器{}中声明。 But luckily you could tell the compiler that the array you are passing is going to be const at least for the certain duration. 但幸运的是,您可以告诉编译器您传递的数组至少在特定持续时间内将是const。 You could do the following this would yield 你可以做到以下这会产生

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

The const_cast inside would remove the const-ness of the array of characters std::string is owning. 内部的const_cast将删除std :: string所拥有的字符数组的常量。 So, it is quite possible that function might change the contents of array of characters behind the back of std::string. 因此,很可能函数可能会改变std :: string后面的字符数组的内容。 When behaviour of functions taking such argument is known then this might be ok. 当知道采用这种参数的函数的行为时,这可能是正常的。

If you want to create a const array of char* without resorting to const_cast or managing memory using new/delete, you could use std::vector > instead of vector of strings. 如果你想创建一个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]));

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM