Convertir une chaîne en int (mais seulement si est vraiment un int)
-
19-09-2019 - |
Question
Au collège on m'a demandé si notre programme détecte si la chaîne d'entrer des arguments de ligne de commande est un entier qui il n'a pas (./Program 3.7
). Maintenant, je me demande comment je peux détecter. Ainsi, l'entrée par exemple a
est invalide qui Atoi Détecte, mais l'entrée comme par exemple 3.6
devrait être invalide, mais atoi va convertir en un entier.
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
int number = atoi(argv[1]);
printf("okay\n");
}
}
Mais biensur d'accord ne devrait être imprimé si argv [1] est vraiment un entier. Espérons que ma question est claire. Merci beaucoup.
La solution
Jetez un oeil à strtol .
Si endptr est NULL, strtol () stocke l'adresse du premier caractère invalide dans * endptr. S'il n'y avait aucun chiffre, cependant, strtol () stocke la valeur originale de str en * endptr. (Ainsi, si * str n'est pas
\0' but **endptr is
\ 0' en retour, la chaîne entière est valide.)
#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");
}
}
Autres conseils
En supposant que vous voulez savoir comment cela pourrait se faire dans le code (possible si elle est en effet devoirs), d'une façon est de penser à ce qui constitue un nombre entier en termes de la chaîne. Il serait très probablement:
- un signe optionnel, +/-.
- un chiffre nécessaire.
- un nombre quelconque de chiffres en option (mais attention en cas de débordement).
- la fin de la chaîne.
A partir de cette spécification, vous pouvez écrire une fonction qui fera le travail pour vous.
Quelque chose comme ce pseudo-code serait un bon début:
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.
Donc, votre meilleur choix est 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: permet - et + caractères
Vous pouvez même Compress dans un dense d'un ou deux doublure. Ou vous pouvez trouver une fonction de bibliothèque avec la même fonctionnalité;)
EDIT2: juste pour le plaisir - il doit maintenant analyser le nombre