2016-11-10 124 views
1

我用一些命令行參數運行我的程序。但是,當我輸入10,10,10,並打印出來,它打印出49,49,49,這裏是我的代碼:從C中的命令行參數打印整數

int main(int argc, char *argv[]) { 
    int seed = *argv[0]; 
    int arraySize = *argv[1]; 
    int maxSize = *argv[2]; 

這究竟是爲什麼?

回答

1

那麼,argv是指向字符串的指針數組。所有命令行參數都以字符串的形式傳遞,並且指向每個命令行參數的指針都由argv[n]保存,其中參數的序列爲n+1

對於託管環境,引用C11,章§5.1.2.2.1

如果argc值大於零,則字符串由argv[0] 指出,代表程序名稱;如果 程序名稱在主機環境中不可用,則argv[0][0]應爲空字符。如果argc的值是 大於1,則由argv[1]argv[argc-1] 指向的字符串表示程序參數。

因此,很明顯,對於像

./123 10 10 10 // 123的執行是二進制名稱

  • argv[0]未在第一個「命令行參數傳遞給程序「。這是argv[1]
  • *argv[1]不會返回您作爲命令行參數傳遞的int值。

    基本上,*argv[1]給你(即,'1'一個char值),最有可能在ASCII編碼值(你平臺使用),ANSD根據ascii table一個'1'字符串的第一個元素的值有小數點;你看到的49

解決方案:你需要

  • 檢查的參數(argc)的數量
  • 循環每個參數字符串argv[1] ~ argv[n-1]argc == n
  • 轉換每個輸入來的int(對於這種情況,您可以使用strtol()
1

解引用一個字符串(*argv[x])給你一個char(在字符串中的第一個字符的值),在這種情況下,值是ASCII '1':十進制49

您可以將這些字符串(沒有提領)使用strtol

int arraySize = (int)strtol(argv[1], NULL, 10); 

反正argv[0]是你的程序的名字,你確定那個程序名從1開始?