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?

¿Fue útil?

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 */
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top