2016-10-01 2 views
-1

https://stackoverflow.com/a/236803/6361644에서 언급 한 다음 코드를 사용하여 문자열을 벡터로 구문 분석하여 각 요소를 공백으로 구분하는 다음 코드를 작성했습니다. 두 번째 요소는 덮어 쓰는 이유 코드 뒤에벡터로 문자열 나누기 <char*> 벡터 요소를 덮어 씁니다.

std::string line = "ls -l -a"; 
std::string cmd; 
std::vector<char*> argv; 
std::stringstream ss; 
ss.str(line); 
std::string tmp; 
getline(ss, cmd, ' '); 
argv.push_back(const_cast<char*>(cmd.c_str())); 
while(getline(ss, tmp, ' ')) 
    argv.push_back(const_cast<char*>(tmp.c_str())); 
argv.push_back(NULL); 

인쇄 ARGV는 잘 모르겠어요

{gdb) print argv                   
$22 = std::vector of length 3, capacity 4 = {0x26014 "ls", 0x2602c "-a", 0x2602c "-a", 0x0} 

제공합니다. 어떤 조언을 부탁드립니다.

+0

실제로 링크 된 답변에서 언급 한 코드를 사용하지 않았습니다. – Barry

답변

2

당신은 매달려있는 포인터를 저장하고 있습니다 (형식이 잘못되어도 C 스타일 문자열에 대한 포인터를 저장하는 올바른 방법은 이 아니라 const char*입니다). 이 (const -corrected) 루프에서

:

std::vector<const char*> argv; 
// ... 
while(getline(ss, tmp, ' ')) 
    argv.push_back(tmp.c_str()); 

이후의 모든 반복하면 저장 한 이전의 포인터를 무효화 tmp을 취소합니다. tmp.c_str()을 밀어 올리면 즉시 getline()에 의해 해제됩니다. 따라서 모든 후속 액세스는 정의되지 않습니다.

std::vector<std::string> argv; 
// ... 
while(getline(ss, tmp, ' ')) 
    argv.push_back(std::move(tmp)); 

그리고 지금 argv 실제로 자신의 모든 자원을 소유 : 당신은 모든 문자열의 소유권을해야

대신 전체 string를 저장하여 수행 할 수 있습니다.

-1

c_str()에 의해 반환 된 포인터는 std::string의 내부 데이터를 가리 킵니다.

이 포인터는 문자열이 삭제되거나 수정 될 때까지만 유효합니다. std::string이 파괴되거나 수정되면 포인터가 더 이상 유효하지 않습니다.

while(getline(ss, tmp, ' ')) 
    argv.push_back(const_cast<char*>(tmp.c_str())); 

이미 붉은 깃발입니다 멀리 const -ness 캐스팅의 문제, 따로 설정 :마다 tmp의 내용이 ss 파일의 다음 라인으로 대체 얻을 while 루프 반복합니다.

이렇게하면 while 루프의 이전 반복에서 얻은 c_str()이 자동으로 무효화됩니다.

여기서 올바른 해결책은 모든 개별 단어를 std::vector<std::string>으로 먼저 구문 분석하는 것입니다.

그런 다음이 벡터가 초기화되면 벡터를 반복하고 각 문자 열의 c_str()을 가져 와서 원시 문자 포인터 벡터를 구성합니다.

std::string 대신 std::vector<char>을 사용하고 각 벡터의 끝에 '\ 0'문자를 추가하면 못생긴 const_cast은 필요하지 않습니다.

+0

널 문자로 끝나는 문자열을 저장하기 위해 왜'벡터 '을 제안하겠습니까? 그게 바로'string'의 목적입니다. -1. – Barry

+0

왜냐하면 그는 명백한'exec()'를 위해서'char *'가 필요하기 때문입니다. –

+1

잘못된 컨테이너를 사용하고 수동으로 널 종료자를 사용하는 것은'const_cast'보다 훨씬 못 생깁니다. –