2013-08-19 92 views
-3

我想我這個代碼控制檯應用程序內分析運行參數:參數解析錯誤

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    if(argv[1] == _T("arg1")) cout<<"Argument1 was passed"; 
    _getch(); 
    return 0; 

} 

我的代碼不能正常工作。我的意思是,它運行,但控制檯是空的。 我正在使用Visual Studio 2012(Windows 7)中的Use Unicode Character Set選項進行編譯。 我的錯誤在哪裏?

+0

你應該在寫出你的輸出之後使用'<< std :: endl',以保證'std :: cout'的順便沖洗。 –

回答

8

使用strcmp比較char陣列

使用 ==
if(strcmp(argv[1], "arg1") == 0) 

只是比較指向兩個不同的字符串。

見大流士Kucinskas的回答比較_TCHAR陣列

+0

我正在使用'_TCHAR *' – Victor

+0

@Victor我已更新以顯示如何將'argv [1]'與ascii字符串進行比較。 Darius Kucinskas的回答指向'_TCHAR'的等價函數 – simonc

+0

只要他在命令行上傳遞了某些東西,它就可以工作。如果他只是運行程序(沒有命令行參數),行爲是未定義的(他試圖訪問傳遞數組的末尾)。 –

5
if (_tcscmp(argv[1], _T("arg1")) == 0) { 
    cout << "Argument1 was passed" << endl; 
} 
+0

+1。我錯過了'_TCHAR'的使用 – simonc

+0

@simonc是的,但你是第一個;) –

0

你有幾個錯誤:

1)你不能比較使用==操作符C風格字符串(字符數組)。 argv[#]是一個字符數組,與_T("some value")一樣。爲了比較它們,您需要使用strcmp(或它的一個表親),或將其存儲在std::string中。

2)您正試圖訪問數組的第2個元素,但只有1個元素存在。你說你沒有通過任何通話,這意味着argv[0]將包含數據(您正在運行的可執行文件的名稱),但argv[1]不會。一般來說,試圖訪問它將嘗試訪問數組範圍之外的數據,並得到未定義的結果。在這種特殊情況下,標準(第3.6.2節)指出它將始終爲0(又稱NULL)。所以你的條件將永遠是錯誤的。

3)當預期命令行參數時,您應該始終檢查argc的值。