Convertire una stringa in int (Ma solo se è davvero un int)
-
19-09-2019 - |
Domanda
Al college mi è stato chiesto se il nostro programma rileva se la stringa di entrare da argomenti della riga di comando è un intero che non ha fatto (./Program 3.7
). Ora mi chiedo come posso rilevare questo. Così input come ad esempio a
non è valido, che atoi rileva, ma di input come ad esempio 3.6
dovrebbe essere valida, ma atoi convertirà l'accaduto a un numero intero.
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
int number = atoi(argv[1]);
printf("okay\n");
}
}
Ma offcourse va bene dovrebbe essere stampato solo se argv [1] è davvero un numero intero. Spero che la mia domanda è chiara. Molte grazie.
Soluzione
Dai un'occhiata alla strtol .
Se endptr non è NULL, strtol () memorizza l'indirizzo del primo carattere non valido in * endptr. Se non ci fossero le cifre a tutti, però, strtol () memorizza il valore originale di str in * endptr. (Così, se * str non è
\0' but **endptr is
\ 0' al ritorno, l'intera stringa era valido.)
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
char* end;
long number = strtol(argv[1], &end, 0);
if (*end == '\0')
printf("okay\n");
}
}
Altri suggerimenti
Supponendo che si vuole sapere come potrebbe essere fatto in codice (possibile se è davvero compiti a casa), un modo è quello di pensare a ciò che costituisce un intero in termini di stringa. Sarebbe molto probabilmente:
- un segno opzionale, +/-.
- una cifra necessaria.
- qualsiasi numero di cifre opzionali (ma attenzione per overflow).
- alla fine della stringa.
Da che specifica, è possibile scrivere una funzione che farà il lavoro per voi.
Qualcosa di simile a questa pseudo-codice sarebbe un buon inizio:
set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
set index to index + 1.
else:
if char[index] is '-':
set sign to -1.
set index to index + 1.
while char[index] not end-of-string:
if char[index] not numeric:
return error.
set accumulator to accumulator * 10 + numeric value of char[index].
catch overflow here and return error.
set index to index + 1.
set gotdigit to true.
if not gotdigit:
return error.
return sign * accumulator.
Quindi, la scelta migliore è strtof()
http: // publib.boulder.ibm.com/infocenter/zos/v1r10/topic/com.ibm.zos.r10.bpxbd00/strtof.htm
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
if( *p>='0' && *p<='9' ) {
value = 10*value + *p-'0';
} else {
okay = 0;
break;
}
}
if( okay ) {
value *= sign;
printf( "okay, value=%d\n", value );
}
EDIT: permette - e + caratteri
Si può anche comprimere questo in un denso uno o due-liner. Oppure si può trovare una funzione di libreria con le stesse funzionalità;)
EDIT2: solo per divertimento - ora dovrebbe analizzare il numero