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.

Était-ce utile?

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.
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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top