verificación de errores de segmentación argumentos del usuario c

Estoy tratando de validar la entrada del usuario desde la línea de comandos con argc y argv pero me estoy topando con una falla de segmentación y no estoy seguro de por qué.

Quiero validar si el usuario ha ingresado un int positivo (por lo tanto, argc = 2 y argv es positivo).

Aquí está mi código:

int main (int argc, string argv[]) { int k = atoi(argv[1]); if (argc != 2 && k <1) { return 1; } } 

La parte k <1 de mi código parece estar funcionando bien, pero recibo errores de segmentación cada vez que trato de ejecutar sin el nombre del programa y un argumento (agrc! = 2).

EDITAR:

Descripción más clara del problema de manejo de errores:

Si ejecuto ./myprogram -2, obtengo mi devolución 1 como se esperaba.

Si ejecuto ./myprogram hjdksfhdsk, obtengo mi devolución 1 como se esperaba.

Si ejecuto ./myprogram entonces obtengo una falla de segmentación.

Es este comportamiento el que me hace pensar que mi manejo del valor argc es un error, pero no estoy seguro de por qué no puedo probar argc! = 2.

Esto es incorrecto, ya que en la string C no es un tipo incorporado (y no es un tipo estándar definido en algún encabezado estándar; observe que C ++ tiene std :: cadena definida en su encabezado estándar ).

La firma de main debe ser

 int main(int argc, char**argv); 

La convención es que argv[argc] es el puntero nulo, y los punteros argc desde argv[0] a argv[argc-1] son punteros no nulos a cadenas terminadas en nulo.

Tenga en cuenta que (al menos en los sistemas Linux y Posix) los argumentos del progtwig no son una entrada del usuario al progtwig. El shell recibió una línea de comando como entrada y expandió esa línea de comando en los argumentos del progtwig. Su progtwig podría leer más tarde alguna entrada, por ejemplo, con scanf .

No puede convertir un puntero NULL con atoi , por lo que debe verificar argc antes de hacer la conversión.

 int main(int argc, char**argv) { if (argc!=2) { fprintf(stderr, "%s needs two arguments\n", argv[0]); exit(EXIT_FAILURE); }; int k = atoi(argv[1]); if (k<=0) { fprintf(stderr, "%s wants a positive first argument, but got %s\n", argv[1]); exit(EXIT_FAILURE); } // now do the real thing } 

Por cierto, creo que (al menos en el sistema Linux o Posix) un progtwig debería aceptar el argumento --help según el estándar de encoding GNU . Le sugiero que use getopt (notablemente getopt_long ) o argp para analizar los argumentos del progtwig.

Finalmente, compile con todas las advertencias y la información de depuración (por ejemplo, con gcc -Wall -g ) y aprenda a usar el depurador (por ejemplo, gdb ).

Tu principal debe ser

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

Y haz la comprobación antes de usar en atoi en argv[1]

También todas las rutas deben devolver un valor. Bung return 0; al final

Como otros han señalado, la cadena no es un tipo base. Sin embargo, ya que está obteniendo resultados en un caso, su falla de segmentación tiene que ver con el atoi en argv 1. En c las matrices se basan en 0, por lo que está intentando convertir la memoria sin inicializar. Utilice la prueba de argc antes del atoi.