2012-05-20 10 views
1

내 C++ 코드에서 perl 스크립트를 실행해야합니다. 이것은 system()으로 수행됩니다. 이 같은 내 시스템()에system()에서 인수 char argv [] 사용

int main(int argc, char * argv[]) 

:
지금 난 내 코드에서 두 번째 인수를 전달해야 "유형 'const를 문자의 유효하지 않은 피연산자 :

char *toCall="perl test.pl "+argv[1]; 
system(toCall); 

는 이제 오류를 제공합니다 [14] '및'char ** 'to binary'operator + ' "

내가 뭘 잘못하고 있니? 당신은 두 개의 원시 포인터를 추가 할 수 없습니다

std::string const command = std::string("perl test.pl ") + argv[1]; 
system(command.c_str()); 

같은

+1

코드가 완전히 안전하지 않습니다. argv [1]이';/bin/rm -rf $ HOME' –

+0

@BasileStarynkevitch : 당신 말이 맞습니다. 그러나 OP가 입력 검사를 추가 할 계획인지는 알 수 없습니다. 여기에 그것을 보여주는 것은 더 명확한 질문을하지 않았을 것입니다. –

답변

6

사용 std::string.

그러나 std::string+ 연산자의 오버로드를 제공합니다.

+0

기술적 인면에서 첫 번째는'const char []'이지만, 실제로는 부작용이있는 포인터를 추가하려고 시도합니다. – chris

+0

이것은 보안 허점을 만듭니다 :'./script 'myarg && echo hello''는 ./script를 myarg와 함께 실행하고 hello를 출력합니다. – Xorax

+0

@ Xorax : [Doc Brown의 초기 의견] (http://stackoverflow.com/questions/10674721/using-argument-char-argv-in-system/10674740?noredirect=1#comment13850347_10674721)을 참조하십시오. –

1

char*을 지정하여 연결 문자열을 만들 수 없습니다. std::string 또는 std::ostringstream을 사용해야합니다.

std::ostringstream s; 

s << "perl test.pl"; 
for (int i = 1; i < argc; i++) 
{ 
    // Space to separate arguments. 
    // You need to quote the arguments if 
    // they can contain spaces. 
    s << " " << argv[i]; 
} 

system(s.str().c_str()); 
+0

매우 빠른 답변을 보내 주셔서 감사합니다. 그것은 매우 유용했습니다 !!! –