2010-12-07 37 views
9

我有一個計劃:C++,命令行參數沒有被正確解析

int _tmain(int argc, char* argv[]) 
{ 
    std::cout << "STARTING" << std::endl; 
    std::cout << "Num inputs: " << argc << std::endl; 

    for(int i = 0; i < argc; i++) 
     std::cout << argv[i] << std::endl; 

,我希望打印出所有的命令行參數。但是,輸出是這樣的:

./Test.exe的hello world

STARTING 民輸入:3 。 ^ h W¯¯

看來,它只是看着每個參數的第一個字符,而不是整個的char *,直到終止符。

任何人有任何想法?

其他注意事項:通過VS2008創建它,我基本上是在互聯網上覆制和粘貼一個應該工作的例子。我已經在bash,powershell和cmd中運行該程序。

+3

I beleive`_tmain()`expect`tchar` – ruslik 2010-12-07 21:10:47

+0

如果你在你的程序中加入了一個`main`函數,它還會發生嗎? IE瀏覽器,您更改`_tmain`的名稱後... – 2010-12-07 21:11:15

+0

相關:[http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c] (http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c) – 2013-09-02 08:35:53

回答

3

您是否正在Unicode模式下編譯您的代碼?

+0

這是另一個正確的答案。我改變了我的項目設置爲多字節字符集,它的工作原理。謝謝! – jbu 2010-12-07 21:12:41

17

您的Visual C++項目設置爲Unicode,並且您的主函數被稱爲_tmain。這意味着Windows會調用您的函數並傳遞給您Unicode字符串,但您將它們視爲ANSI字符串,並使用char *類型。由於第一個Unicode字符的第二個字節爲空,因此它顯示爲一個帶有一個字符的ANSI字符串。

5

最有可能的是它與UNICODE設置編譯。如果定義了UNICODE,則應該使用wcout而不是cout。所有的字符串都應該放在_T()之內。

#ifdef UNICODE 
#define tout wcout 
#else 
#define tout cout 
#endif 

int _tmain(int argc, TCHAR* argv[]) 
{ 
    std::tout << _T("STARTING") << std::endl; 
    std::tout << _T("Num inputs: ") << argc << std::endl; 

    for(int i = 0; i < argc; i++) 
     std::tout << argv[i] << std::endl; 
4

First char?這聽起來像Unicode被解釋爲ANSI。這說得通。如果你使用_tmain,那麼你必須使用TCHAR。