2011-11-11 51 views
1

這是我在網站上的第一個問題,儘管我一直在這裏參考相當一段時間。我知道argv [0]存儲程序的名稱,其餘的命令行參數存儲在其餘的argv [k]槽中。我也明白,std :: cout把一個字符指針看作是一個以null結尾的字符串,並將字符串打印出來。以下是我的計劃。無法在VC++中使用std :: cout打印出argv []值

#include "stdafx.h" 
#include <fstream> 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    cout << argv[0] << " "; 
    cout << argv[1] ; 

    return 0; 
} 

根據我在互聯網搜索中看到的所有其他程序,這個程序應該打印出兩個字符串即viz。程序名稱和命令行參數。控制檯窗口顯示

0010418c 001048d6

相信這些都是ARGV [0]和argv [1] RESP的指針。 我唯一的命令行參數是「nanddumpgood.bin」,它在argv [1]中進行,如果在調試時將鼠標懸停在argv []數組上,則會正確顯示字符串。

這是怎麼回事?我究竟做錯了什麼?我明白,在特殊情況下數組會衰減到指針?這是它沒有的情況嗎?

回答

5

我也明白std::cout把一個字符指針看作是一個以空字符結尾的字符串,並將字符串打印出來。

這就是主要是正確。它適用於char*,但不適用於其他類型的角色。這正是問題所在。你有一個_TCHAR*,它是ANSI構建的IS char*而不是Unicode構建的,所以不用獲取特殊的字符串行爲,而是獲得默認的指針行爲。

我明白,在特殊情況下數組會衰減到指針嗎?這是它沒有的情況嗎?

argv是一個數組,但既不argv[0]也不argv[1]是數組,它們是兩個指針。衰退在這裏不是一個因素。

最簡單的修復方法是使用int main(int argc, char* argv[]),以便獲取命令行參數的非Unicode字符串。我建議這樣做,而不是切換到wcout,因爲它與您在互聯網上找到的其他代碼更兼容。

2

對於Unicode字符串使用wcout

+0

工作。謝謝。 :) –

+0

如果他使用'wcout',他不妨改變'wchar_t'的參數 –

0

我想你正在用unicode編譯器開關編譯你的應用程序,它將所有的TCHAR作爲wchar_t對待。因此cout將argv視爲int。

寫,而不是

wcout << argv[0] << L" "; 
wcout << argv[1] ; 

或更改Use Multi-byte character組在項目設置/一般。

+0

不,它不會將'argv'視爲int。它是一個指針,但不是'char *'。 –

+0

我正在使用Visual Studio 2010.我想我忘了提及。感謝Ben的澄清。 –