2011-09-30 46 views
2

在用Visual Studio中的一個簡單的C++應用程序2008年我寫了下面的代碼處理命令行參數時,我有一個問題:2字節表示2008年

#include <iostream> 

using namespace std; 

int _tmain(int argc, char **argv) 
{ 
    char* c = *argv;  

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

    int a; 
    cin >> a; 

    return 0;  
} 

我的問題只有每個命令行參數的第一個字符被寫入cout

我確定原因是命令行參數中的字符表示爲2個字節,因此每個其他1個字節只包含0,即'\ 0'。

我的問題是,爲什麼會發生這種情況?從我在網上的樣品中發現它應該如我寫的那樣工作。另外,有沒有辦法強制參數中的字符是1字節表示?

我希望我的問題很清楚。

+2

'_tmain'的簽名是'int _tmain(int argc,TCHAR ** argv)' –

回答

5

您的_tmain正在接收UTF-16字符,當輸入拉丁文字符時,每隔一個字節就有一個字符爲0。您正在將它們解釋爲單字節字符。你需要將它們解釋爲寬字符。

我會寫它是這樣的:

#include <iostream> 

using namespace std; 

int wmain(int argc, wchar_t* argv[]) 
{ 
    for(int i=0; i<argc; ++i) 
    { 
    wcout << argv[i] << endl; 
    } 

    int a; 
    wcin >> a; 

    return 0; 
} 

如果你不想使用UTF-16,那麼你可以用char這樣的堅持:

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

    int a; 
    cin >> a; 

    return 0; 
} 

注意的變化main函數的命名。在MS世界中,wmain收到wchar_t*main收到char*

如果您確實切換到char*,那麼您還應該更新您的項目配置,以將目標設定爲MBCS而不是Unicode。

關於MS編譯器主要功能處理的更多信息可以在這裏找到:main: Program Startup

+0

謝謝您的快速回答。如果我這樣做,使用嚮導,然後將VS2008項目發送給另一個人。他的行爲與我在運行程序時是否一樣? – PKeno

+0

是的,它會是一樣的。事實上,我已經改變了關於巫師的想法。它使用TCHAR,這是混淆不再需要的。看到我的更新(以及我將盡快做的)。 –

+0

謝謝。改成'main'解決了這個問題。 – PKeno