2009-07-11 87 views
3

我在Visual Studio 2008中遇到了一些麻煩。非常簡單的程序:打印以參數形式發送的字符串。Visual C++ argv問題

爲什麼會這樣:

#include <iostream> 

using namespace std; 

int _tmain(int argc, char* argv[]) 
{ 
    for (int c = 0; c < argc; c++) 
    { 
     cout << argv[c] << " "; 
    } 
} 

對於這些參數:

program.exe testing one two three 

輸出:

p t o t t 

我試着用gcc來做這件事,然後我得到了整個字符串。

+6

另外請注意,argv [0]是程序名稱,因此不是其中一個參數。這是一個可以讓未來文明在這個網頁上發生的懸念點。 – 2009-07-11 18:17:45

回答

19

默認情況下,_tmain將Unicode字符串作爲參數,但cout需要ANSI字符串。這就是爲什麼它只打印每個字符串的第一個字符。

如果你想使用Unicode _tmain,你必須與TCHARwcout像這樣使用它:

int _tmain(int argc, TCHAR* argv[]) 
{ 
    for (int c = 0; c < argc; c++) 
    { 
     wcout << argv[c] << " "; 
    } 

    return 0; 
} 

或者如果你樂於使用ANSI字符串,使用正常maincharcout像這樣:

int main(int argc, char* argv[]) 
{ 
    for (int c = 0; c < argc; c++) 
    { 
     cout << argv[c] << " "; 
    } 

    return 0; 
} 

稍微詳細:TCHAR_tmain可以是Unicode ANSI,具體取決於編譯器設置。如果UNICODE被定義,這是新項目的默認值,他們會說Unicode。它的UNICODE沒有定義,他們說ANSI。所以理論上你可以編寫不需要在Unicode和ANSI版本之間改變的代碼 - 你可以在編譯時選擇你想要的代碼。

這個下降的位置是cout(ANSI)和wcout(Unicode)。沒有_tcout或同等學歷。但你可以簡單地創建你自己的並使用它:

#if defined(UNICODE) 
    #define _tcout wcout 
#else 
    #define _tcout cout 
#endif 

int _tmain(int argc, TCHAR* argv[]) 
{ 
    for (int c = 0; c < argc; c++) 
    { 
     _tcout << argv[c] << " "; 
    } 

    return 0; 
} 
0

所有示例都向您展示瞭如何將argv元素打印到標準輸出。我需要的代碼轉換爲字符串,我用這個:

string localeCode="en-us"; 
if(argc>1) 
{ 
    #define LOCALELEN 50 
    char localeArg[LOCALELEN+1]; 
    size_t result=-1; 
    wcstombs_s(&result, localeArg, LOCALELEN, argv[1], LOCALELEN); 
    if(result) 
    { 
     localeCode.assign(localeArg); 
    } 
    #undef LOCALELEN 
}