2010-05-12 51 views
0

我有一個Visual Studio 2008 C++應用程序,我想將所有程序參數複製到由空格分隔的字符串「」中。即,如果我的程序被稱爲foo.exe \Program Files,那麼我下面folder字符串將包含\Program Files將程序參數複製到空格分隔的std :: string

下面是什麼,我現在在做一個例子。我想知道是否有這樣做的更簡單或更簡單的方法。有沒有簡單的方法來消除std::wstringstream變量?

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 2010-05-12 16:04:46

+0

我會注意到,對於我接受的解決方案,托馬斯的評論是必不可少的。你必須雙引號的空格/空白的參數(路徑)。然而,雙引號不會出現在你的程序中。 – 2010-05-12 16:19:04

回答

1

如何:

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 
} 

這應該工作。即使現在聲明main()函數,它仍應該從TCHAR(我認爲)工作,或者您可以將main的聲明更改爲更「標準」的main()聲明。

0

如果我的節目被稱爲foo.exe \Program Files,那麼我下面的文件夾中的字符串將包含\Program Files

當你的程序被調用兩個不同的參數foo arg1 arg2,那麼你希望字符串是arg1 arg2呢?

通常的方式來處理,這是正確地調用該程序首先:

 
foo "\Program Files" 

這將使argv[1]包含"\Program Files"

0

首先,請注意托馬斯的評論 - 他的觀點非常重要。

現在,你可以找到你的論點長度,使它們成爲一個字符串與大小,所以(注意我的C++的語法可能有點過,但概念是有:))

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++; 
} 
+0

這有一個'C++'標記,那麼爲什麼不使用'std :: string'而不是手動擺弄字符緩衝區? (即使在C標準庫中也有函數來複制字符串,不需要自己創建字符串。) – sbi 2010-05-12 16:17:58

相關問題