2010-05-12 6 views
0

모든 프로그램 인수를 공백으로 구분 된 문자열로 복사하려는 Visual Studio 2008 C++ 응용 프로그램이 있습니다. 즉, 내 프로그램이 foo.exe \Program Files으로 호출 된 경우 아래공백 문자로 프로그램 인수 복사 std :: string

아래에 내 folder 문자열이 포함됩니다. 아래는 내가 지금하고있는 일례입니다. 나는 이것을하는 더 짧거나 쉬운 방법이 있는지 궁금 해서요. 변수 std::wstringstream을 쉽게 제거 할 수 있습니까?

int main(int argc, char* argv[]) 
{ 
    std::string path; 
    if(argc < 2) 
    { 
     std::cout << "Not enough arguments" << std::endl; 
     return; 
    } 
    path = argv[1]; // Assignment works from char* types 
    // Do the rest of your folder manipulation below here 
} 

작동합니다 : 이것에 대해 어떻게

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::wstringstream f; 
    std::copy(argv + 1, 
       argv + argc, 
       std::ostream_iterator< std::wstring, wchar_t >(f, L" ")); 
    std::wstring folder = f.str(); 

    // ensure the folder begins with a backslash 
    if(folder[ 0 ] != L'\\') 
     folder.insert(0, 1, L'\\'); 

    // remove the trailing " " character from the end added by the std::copy() above 
    if(*folder.rbegin() == L' ') 
     folder.erase(folder.size() - 1); 

    // ... 
} 

감사합니다, PaulH

+5

공백이있는 경로를 처리하는 일반적인 방법은 명령 줄에 따옴표를 넣는 것입니다. 그러면 프로그램은 공백이있는 경로를'argc'의 단일 엔트리로 볼 것이므로이 특별한 처리를 할 필요가 없습니다. 이 작업을 사용자에게 제공하려는 것일 수 있지만 나중에 명령 줄 옵션을 추가하려는 경우 어떻게해야합니까? – Thomas

+0

아래에서 필자가 받아 들인 솔루션에 대해서는 Thomas의 코멘트가 필수적이라는 점에 유의할 것입니다. 반드시 공백/공백이있는 인수 (경로)를 큰 따옴표로 묶어야합니다. 그러나 큰 따옴표는 프로그램 안에 존재하지 않습니다. –

답변

1

. main() 함수가 지금 선언 된 경우에도 여전히 TCHAR (내 생각)에서 작동해야하며 main 선언을 더 "표준"main() 선언으로 변경할 수 있습니다. 내 프로그램이 foo.exe \Program Files로 불려 갔을 경우

0

, 다음 아래에있는 내 폴더 문자열은 프로그램이 두 가지 인수foo arg1 arg2으로 호출 될 때 \Program Files

그리고는, 당신은 문자열이 arg1 arg2되고 싶어요 포함됩니다 , 너무?

이 처리하는 일반적인 방법은 처음에 제대로 프로그램을 호출하는 것입니다

 
foo "\Program Files" 

argv[1]"\Program Files"를 포함 할 것이다.

0

먼저 토마스의 의견을 주목하십시오. 그의 요점은 매우 중요합니다. 이제

int length = 0; 
for(int i = 1; i < argc; i++) { 
    length += strlen(argv[i]); 
} 
// now add one for each require space 
length += argc-2; 

char* fullString = new char[length]; 
int ptr = 0; 
for(int i = 1; i < argc; i++) { 
    int strlen = strlen(argv[i]); 
    for(int j = 0; j < strlen; j++) { 
     fullString[ptr] = argv[i][j]; 
     ptr++; 
    } 
    fullString[ptr] = ' '; 
    ptr++; 
} 
(:) 조금을 수 있습니다 내 C++ 구문을 참고하지만, 개념이있다), 당신은 당신의 인수의 길이를 찾을 수 등으로 그 크기가 하나의 문자열로 만들
+0

이것은'C++'태그를 가지고 있습니다. 왜 수동으로 문자 버퍼를 사용하지 않고'std :: string'을 사용하지 않으시겠습니까? (그리고 C std lib에서도 문자열을 복사 할 수있는 기능이 있습니다. 자신의 것을 추출 할 필요가 없습니다.) – sbi

관련 문제