2017-04-30 4 views
6

Je souhaite analyser un entier, mais mon code suivant accepte également des chaînes telles que "3b" qui commencent par un nombre mais qui ont des caractères ajoutés. Comment rejeter de telles chaînes?analyser un entier sans ajouter de caractère dans C

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int n; 
    if(argc==2 && sscanf(argv[1], "%d", &n)==1 && n>0){ 
     f(n); 
     return 0; 
    } 
    else{ 
     exit(EXIT_FAILURE); 
    } 
} 
+4

Vous n'utilisez pas 'sscanf()'; vous utilisez 'strtol()' ou similaire, et vérifiez où pointe le pointeur de fin. Ou, si vous devez utiliser 'sscanf()', vous utilisez 'int pos; ... si (... && sscanf (argv [1], "% d% n", & n, & pos) == 1) '- notez que le'% n' n'est pas compté comme une conversion donc la comparaison est toujours contre ' 1', pas '2'. Vous vérifiez ensuite si 'argv [1] [pos]' est un octet nul ou non, se plaignant si ce n'est pas le cas. –

+0

http://stackoverflow.com/questions/13199693/what-does-the-n-stand-for-in-sscanfs-d-n-i-n –

Répondre

4

Pour votre problème, vous pouvez utiliser la fonction strtol() de la bibliothèque #include <stdlib.h>.

Comment utiliser strtol (Sample code from tutorial points)

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char str[30] = "2030300 This is test"; 
    char *ptr; 
    long ret; 

    ret = strtol(str, &ptr, 10); 
    printf("The number(unsigned long integer) is %ld\n", ret); 
    printf("String part is |%s|", ptr); 

    return(0); 
} 

A l'intérieur du strtol, il scanne str, stocke les mots d'un pointeur, puis la base du nombre converti. Si la base est entre 2 et 36, elle est utilisée comme base du nombre. Mais je recommande de mettre zéro où le 10 est ainsi il choisira automatiquement le bon nombre. Le reste est stocké dans ret.

+0

Vous devriez également expliquer comment rejeter des chaînes telles que '" 3b "'. –

0

La bibliothèque ctype.h vous offre la fonction fonction isdigit (char) qui retourne si le charbon fourni comme argument est un chiffre ou non.
Vous pouvez itérer sur argv [1] et vérifier de cette façon.

+0

L'utilisation de 'isdigit()' est raisonnable si seulement des entiers à un chiffre sont acceptables. Si des entiers à plusieurs chiffres sont autorisés, alors 'isdigit()' n'est pas une bonne solution. Il est préférable d'utiliser une fonction de conversion chaîne-entier qui convertit aussi bien que les vérifications (donc 'strtol()' et al plutôt que 'atoi()'). –