2014-02-23 24 views
0

的值,如果我的Visual Studio下編譯該代碼2013的argc從不具有上面2

int main(int argc, char* argv[]) 
{ 
std::cout << "arg count: "<< argc << "/n"; 
} 

,然後用沒有額外的參數(即,>的Program.exe)運行它,它輸出

arg count: 1 

用1個參數(>的Program.exe ARG1)它輸出

arg count: 2 

但是,這是這樣會很奇怪。如果我輸入(> program.exe arg1 arg2)它輸出

arg count: 2 

「arg count」應該是3,應該不是嗎?

與(>的Program.exe ARG1參數3)它輸出

arg count: 2 

它應該是在這種情況下4 ...

印刷的argv [3]由於某種原因,工作正常。

爲什麼會發生這種情況?

+1

而當你擺脫了嘗試打印'的argv [3]'的,會發生什麼?這會將未定義的行爲引入到您的程序中。 –

+1

你能告訴你如何提供這些參數嗎?具體來說,你如何調用該程序? –

+0

來自'argv'的最後一個指針通常被初始化爲'NULL',即可以在沒有索引的情況下迭代參數。 –

回答

2

C++標準第3.6.1定義瞭如何main及其參數工作:

在後者的形式,用於說明的目的,第一函數參數是 稱爲的argc和第二函數的參數是稱爲argv,其中argc應該是從程序運行環境傳遞給程序的參數 的數量。如果的argc是非零這些參數 應的argv [0]通過的argv [的argc-1]作爲指針空終止 多字節串(ntmbs S)(17.5.2.1的初始字符提供。 4.2)和argv [0]應該是指向ntmbs的初始字符的指針,它表示用於調用程序或「」的名稱。 argc的值應該是非負的。 argv [argc]的值應爲0。 [注意:建議在argv後添加任何其他(可選)參數 。 - 注意]

這意味着使用符合標準的編譯器,您應該能夠訪問argv[argc]。 訪問argv[n]與n>argc是未定義的。它可能會崩潰,但不一定。

你遇到的情況很奇怪,顯然這些參數是作爲單個參數處理的。如果您完全按照陳述提供參數,則不應該發生這種情況。

您應該修復main的簽名。該標準保證至少這兩個簽名,別的是實現定義:

- 的(函數)返回int和

- 的功能(INT,指針指向char)返回int

由於您想訪問參數,相應的簽名是int main(int argc, char** argv)

+0

我的問題是argc沒有反映出參數的數值的大小,我編輯的問題要更簡潔一些。 – tomatopipps

+0

函數參數的上下文,'char ** argv'等價於'char * argv []'。 –

+0

@AmbrozBizjak該問題的舊版本具有CHAR類型,明顯錯誤(除非它是char的typedef ')。我對此深信不疑 – stefan

0

我可以猜測,要麼你輸入的

(>的Program.exe 「ARG1 ARG2」

(>program.exe arg1,arg2 
1

好吧,事實證明,這個問題在一些代碼我不包括在這裏我的代碼是:

if (argc = 2) { do some stuff } 

它應該是

if (argc == 2) { do some stuff } 

感覺真是愚蠢:\

+0

啓用警告,這種錯誤不會再發生。雖然我不知道VS2013的標誌。 – stefan

+1

警告級別4.右鍵單擊解決方案資源管理器中的項目,選擇屬性,在左側樹形結構中單擊C/C++,找到警告級別並將其降低以更改爲Level4。不要選擇全部,大多數圖書館不能在所有級別上清理乾淨。 –

+0

@Kate VC++是否有一個特殊的編譯器標誌來包含庫的包含文件並忽略它們的警告? GCC/clang擁有'-isystem'。這樣我就可以用最高的警告級別編譯我自己的代碼。沒有它,我會發瘋。 –