Domanda

Lavorare su un semplice programma C mi sono bloccato con un caso di test:

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

Che cosa posso fare per controllare adeguatamente la gamma di linee che voglio affrontare?

È stato utile?

Soluzione

Naturalmente non funziona: argv è un puntatore a puntatore a char .. non è chiaro cosa si vuole fare a meno di pensare che argv[2] è terzo parametro e argv[4] è quinto. Ma sono di tipo char* (sono stringhe), quindi se si vuole analizzare loro come numeri interi si dovrebbe farlo utilizzando la funzione atoi:

int value = atoi(argv[2]);

analizzerà int che era come terzo parametro e metterlo nella variabile, allora si può controllare quello che vuoi.

Altri suggerimenti

Non si dovrebbe usare la funzione atoi. Se, infatti, lo si dimentica mai esistito. Non ha usi pratici.

Mentre la risposta di Jack è ragione nell'affermare che le corde argv devono essere convertiti in numeri primi, utilizzando atoi a tal fine (in particolare nella situazione quando l'ingresso viene dal "mondo esterno") è un crimine contro di programmazione C. In pratica non esistono situazioni in cui può essere utilizzato atoi significato in un programma.

La funzione che si dovrebbe usare in questo caso è strtol

char *end;
long long_value = strtol(argv[2], &end, 10);
if (*end != '\0' || errno == ERANGE)
  /* Conversion error happened */;

Il controllo degli errori esatta condizione (come se richiedere *end == '\0') sarà effettivamente dipenderà dal vostro intento.

Se si vuole ottenere un int, alla fine, si dovrebbe anche controllare il valore per la gamma int (o per la vostra gamma specifica per l'applicazione)

if (long_value < INT_MIN || long_value > INT_MAX)
  /* Out of bounds error */;

int value = long_value;
/* This is your final value */
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top