Comprobación de rango con argumentos de línea de comandos
-
18-09-2019 - |
Pregunta
Trabajo en un sencillo programa C que estoy atascado con un caso de prueba:
int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))
gcc dice:
cp.c:25: warning: comparison between pointer and integer cp.c:25: warning: comparison between pointer and integer
¿Qué puedo hacer para comprobar correctamente el rango de líneas quiero tratar?
Solución
Por supuesto que no funciona: argv
es un puntero a puntero a char
.. no está claro lo que quiere hacer, pero pensar que es argv[2]
tercer parámetro y argv[4]
es quinto. Pero son de tipo char*
(son cuerdas) por lo que si desea analizar los números enteros como debe hacerlo utilizando el atoi
función:
int value = atoi(argv[2]);
analizará int que era como tercer parámetro y lo coloca en la variable, entonces se puede comprobar lo que quiera.
Otros consejos
No deberías estar usando atoi
función. Si el hecho, de que olvide alguna vez existió. No tiene usos prácticos.
Si bien la respuesta de Jack tiene razón al afirmar que las cadenas argv
tienen que ser convertidos a números primero, usando atoi
para ese propósito (específicamente en la situación cuando la entrada proviene del "mundo exterior") es un crimen contra la programación C. Prácticamente no existen situaciones en las que atoi
se puede utilizar de manera significativa en un programa.
La función que usted debe utilizar en este caso es strtol
char *end;
long long_value = strtol(argv[2], &end, 10);
if (*end != '\0' || errno == ERANGE)
/* Conversion error happened */;
La comprobación de errores condición exacta (como si se debe requerir *end == '\0'
) en realidad dependerá de su intención.
Si desea obtener una int
, al final, también debe comprobar el valor de rango int
(o de su rango específico de la aplicación)
if (long_value < INT_MIN || long_value > INT_MAX)
/* Out of bounds error */;
int value = long_value;
/* This is your final value */