2013-04-12 9 views
4

현재 매우 기본적인 셸로 작동해야하는 클래스에 대한 과제를 작성하고 있습니다. 거의 끝났지 만 execvp과 매개 변수의 문자 배열 문제가 있습니다. 여기 내 코드의 간단한 미리보기가있다.C++ const char * to const char * const

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

그리고 이것은 내 오류가

나는 문제가 내 문자 배열이 일정 데이터의 완전하지 있다는 것을 이해
assign3.cxx:96:34: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive] 

이다가 ...

execvp(cmd_left[0], cmd_left); 

활용, 그래서 나는 본질적으로 const char*에서 const char* const으로 갈 필요가있다. 내가 const_cast에 관해 읽었지만, 내가해야 할 일이 무엇인지 확신 할 수 없었다.

당신이 친절하다면, 문자 배열 배열이 제 기능을 수행하도록 올바르게 도와 줄 수 있습니까? 더 많은 코드를 게시해야한다면 알려주십시오.

감사

답변

1

문제는 당신이 const가 아닌 인수를 기대 기능 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()); 
코드의

다른 부분이 의심스러운,하지만 그것이 어떤에 const_cast없이

+0

아, 정말 고마워요. 그것은 훨씬 더 의미가 있습니다. 또한, 나머지 코드는 문자열을 더 다루기 쉬운 형식으로 분리하는 것입니다. 어쩌면 더 나은 방법이있을 수 있지만 할당이 완료되어 내용이 만족 스럽습니다. – Zerocaliber

+0

@ user2272616 환영합니다. – yngccc

0

를 컴파일 할 것입니다 :

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

v.clear()는 실제로 나중에 다시 사용하기 때문에 실제로 필요합니다. 하지만 캐스팅하지 않고 어떻게하는지 보여 주셔서 감사합니다. – Zerocaliber

0

모든 요소가 이니셜 라이저 {} 내에서 선언되어야하므로 쉽게 const 동적 배열을 만들 수 없습니다. 하지만 운 좋게도 컴파일러에게 전달하는 배열이 최소한 일정 기간 동안 const가 될 것이라고 말할 수 있습니다. 이 문자의 배열의 CONST 다움을 제거 할 내부

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

에 const_cast를 얻을 것이다 다음은 수 std : 문자열이 소유한다 할 수있다. 따라서 함수가 std :: string의 뒤에있는 문자 배열의 내용을 변경할 수도 있습니다. 그러한 인수를 취하는 함수의 동작이 알려져있을 때 이것은 괜찮을 것입니다.

const_cast를 사용하거나 new/delete를 사용하여 메모리를 관리하지 않고 char *의 const 배열을 만들려면 문자열 벡터 대신 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])); 

희망이 있습니다.