Controllo gamma con la linea di comando
-
18-09-2019 - |
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?
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 */