2014-09-02 6 views
2

Я продолжаю работать в «Ошибка сегментации» при попытке ввести менее 5 параметров в программу. Я знаю Java, но новичок в C, и я просто не уверен, что происходит. Я просто пытаюсь преобразовать введенный пользователем килограмм (как параметр) в число 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

Что это должно программа? Зачем нужны некоторые параметры? –

+0

Если вы вводите менее 5 аргументов, почему вы ожидаете, что не получите segfault? 'argv [4]' будет вне границ, и, возможно, другие тоже. –

+1

Задержка вызова atoi, пока вы не проверили argc. –

ответ

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' –

+0

@ FilipeGonçalves спасибо, исправлено – ouah

+0

@ouah Большое спасибо, я не совсем уверен, почему я этого не заметил. – Ryan

1

Если кто-то вводит ./your_program param1 param2, и ваша программа вызывает atoi(argv[3]), тогда atoi получает врученный неверный указатель. Это связано с тем, что значение внутри argv[3] никогда не было установлено (поскольку ваша программа была вызвана только с двумя параметрами). atoi теперь пытается разыменовать данный мусор (потому что он считает, он является законным указателем на символ), вследствие чего возникает ошибка сегментации.

+0

На самом деле, если программе даны два аргумента, 'argv [3]' будет 'NULL'. В любом случае, поведение по-прежнему не определено. – dreamlax

1

Альтернативный подход, который не имеет верхнего предела:

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