2014-09-02 65 views
2

時出現分段錯誤我試圖在程序中輸入少於5個參數時,仍然遇到「分段錯誤」。我認識Java,但對C來說是新手,我只是不確定發生了什麼。我只是簡單地嘗試將用戶輸入的kg(作爲參數)轉換爲Prius的重量數,即小數。使用argv []

#include <stdio.h> 
#include <stddef.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) //Argc is the argument count, argv is the argument vector 
{ 

    //Initialize the toyota/user variables 
    int toyota = 1325; //Toyota weight in kg 
    int paramOne = atoi(argv[1]); 
    int paramTwo = atoi(argv[2]); 
    int paramThree = atoi(argv[3]); 
    int paramFour = atoi(argv[4]); 

    //This if will check to see if there are too many parameters  
    if (argc >= 5) 
    { 
     printf("Error: Too many parameters.\n"); 
     printf("Usage: ./HW1 arg1 [arg2 ... arg4].\n"); 
    } 

    //This if will check to see if there are too few parameters 
    if (argc < 2) 
    { 
     printf("Error: Too few parameters.\n"); 
     printf("Usage: ./HW1 arg1 [arg2 ... arg4.\n"); 
    } 


    //If there are a correct amount of parameters, this will print the TP count 
    if ((argc >= 1) && (argc <= 4)) 
    { 
     printf("%d number of parameters.\n", argc);  

     if(argc >= 1) 
     { 

      printf("%d kg = %d TP.\n", paramOne, paramOne/toyota); //Parameter divided by TP 
     } 

     if(argc >= 2) 
     { 
      printf("%d kg = %d TP.\n", paramTwo, paramTwo/toyota); 
     } 

     if(argc >= 3) 
     { 
      printf("%d kg = %d TP.\n", paramThree, paramThree/toyota); 
     } 

     if(argc >= 4) 
     { 
      printf("%d kg = %d TP.\n", paramFour, paramFour/toyota);  
     } 




    } 

} 
+0

我應該這樣做的計劃?爲什麼需要一些很多參數? – 2014-09-02 22:36:45

+0

如果輸入的參數少於5個,爲什麼你不希望出現段錯誤? 'argv [4]'會超出界限,其他的也可能會超出界限。 – 2014-09-02 22:37:03

+1

延遲調用atoi,直到您測試了argc。 – 2014-09-02 22:38:20

回答

4
int paramOne = atoi(argv[1]); 
int paramTwo = atoi(argv[2]); 
int paramThree = atoi(argv[3]); 
int paramFour = atoi(argv[4]); 

如果argc <= 4這些調用調用未定義的行爲。如果沒有足夠的參數,則在之前測試argc,並且不要調用atoi

+0

你的意思是如果'argc <1' – 2014-09-02 22:36:23

+0

@FilipeGonçalves謝謝,修正 – ouah 2014-09-02 22:38:17

+0

@ouah非常感謝你,我不太清楚爲什麼我沒有注意到這一點。 – Ryan 2014-09-02 22:41:38

1

如果有人輸入./your_program param1 param2,並且您的程序調用atoi(argv[3]),則atoi會得到一個不正確的指針。這是因爲argv[3]內部的值從未設置過(因爲您的程序僅由兩個參數調用)。 atoi現在試圖解引用給定的垃圾(因爲它認爲它是一個字符的合法指針),因此導致Segmention故障。

+0

實際上如果程序有兩個參數,'argv [3]'將會是'NULL'。無論哪種方式,行爲仍未定義。 – dreamlax 2014-09-03 01:32:51

1

其中有沒有上限的另一種方法:

int i = 1; 
while (argv[i] != NULL) 
{ 
    int param = atoi(argv[i]); 
    printf("%d kg = %d TP.\n", param, param/toyota); 
    i++; 
}