Fallo de segmentación con strcmp ()

if(strcmp(argv[2], NULL) == 0) 

Estoy pasando 3 argumentos de línea de comando pero también quiero ejecutarlo con solo 2 argumentos de línea de comando con la statement anterior. Pero se está mostrando un error de falla de segmentación.

Yo también probé con

 if(argc < 3) 

pero tampoco funcionó … la misma falla de segmentación …

¿Por qué falla la segmentación?

Debido al código if(strcmp(argv[2], NULL) == 0) , está pasando NULL como puntero de cadena a la función strcmp() ; que intentan deferencia en NULL para comparar códigos de caracteres (por ejemplo, código acsii), esto causa un comportamiento indefinido en el tiempo de ejecución.

Debería comparar un puntero de cadena con NULL usando == como if(argv[2] == NULL)

Estoy pasando 3 argumentos de línea de comando pero también quiero ejecutarlo con solo 2 argumentos de línea de comando con la statement anterior.

Puedes implementar esto de dos maneras:

  1. La syntax principal es:

     int main(int argc, char* argv[]) 

    El primer argumento argc es el contador de argumentos que es el número total de argumentos pasados ​​a su proceso, incluido el nombre del proceso.

    Entonces, cuando no pasa ningún argumento extra, entonces argc == 1 por ejemplo ./exe

    Supongamos que si pasa tres argumentos de la siguiente manera:

     ./exe firstname lastname 

    Luego argc == 3 , parece que está pasando dos argumentos, pero incluyendo el nombre del ejecutable en realidad está pasando tres argumentos para procesar.

    Por lo tanto, puede usar el valor argc para iterar en un bucle para imprimir los argumentos pasados ​​(otros que no sean ejecutables)

      printf("Process name is: %s", argv[0]); for(i = 1; i < argc; i++ ){ printf("argv[%d] %s\n", argv[i]); } 
  2. La segunda técnica utiliza el segundo argumento: argv[] es una matriz terminada en NULL de cadenas de caracteres, por lo que argv[argc] siempre es igual a NULL. Puede utilizar esta información en bucle para iterar y procesar los argumentos pasados.

    Para entender esto, supongamos que está ejecutando la función como:

     ./exe firstname lastname 

    luego argv[0] == ./exe , argv[1] == firstname y argv[2] == lastname y argv[3] == NULL , argv[3] == NULL cuenta que esta vez argc == 3 ( argv[argc] significa argv[3] == NULL).

    Por ejemplo, para imprimir todos los argumentos, puede escribir su código como:

      int i = 1; printf("Process name is: %s", argv[0]); while(argv[i]){// terminates when argv[i] == NULL printf("argv[%d] %s\n", argv[i]); i++; } 

¿Notan que argv[0] siempre es su nombre ejecutable? esto significa que siempre que necesite imprimir su nombre del ejecutable use argv[0] lugar del nombre del código del ejecutable mientras escribe el código, de modo que si recomstack y le da un nuevo nombre a su ejecutable, argv[0] siempre imprima el nombre correcto. Debe escribir el código de la siguiente manera:

 int main(int argc, char* argv[]){ : :// some other code if(argc < min_number_of_arguments){ fprintf(stderr, "Error: wrong number of arguments passed!\n"); fprintf(stderr, "Usage: %s [first] [second] \n", argv[0]); exit(EXIT_FAILURE); } : :// some other code return EXIT_SUCCESS; } 

En primer lugar, siempre debe usar strcmp(some_string, "") lugar de strcmp(some_string, NULL) para verificar si una cadena está vacía.

Sin embargo en tu problema deberás probar

 if (argc < 4) 

Eso es porque el ejecutable en sí también está en la matriz argv . Considere que está invocando algo como ./a.out param0 param1 , entonces argc sería 3 y argv[0]="./a.out" , argv[1]="param0" , argv[2]="param1" .

EDITADO:

Además, nunca pruebe if(strcmp(argv[2], NULL) == 0) directamente. Siempre prueba argc primero. Como no hay concesionario, el valor se almacenaría en argv[argc+n] para n >= 0

No puedes usar strcmp() para comparar con NULL . Ninguno de los argumentos puede ser nulo. En esta situación no tiene sentido de todos modos. Si el argumento no está presente, argc será <3, y si está vacío de alguna manera será de longitud cero. Nunca nulo

Intereting Posts