Soyez le premier à donner votre avis sur cette source.
Snippet vu 4 348 fois - Téléchargée 34 fois
#include <stdio.h> #include <conio.h> // base maximale : 10 + 26 = 36 // (10 pour les chiffres et 26 pour les lettres) // ----------------------------------------------------------- // s'il y a une erreur, cette fonction retourne // nombre negatif // sinon un nombre entre 0 et 35 qui correspond int ConvCharToDigit(char c,int base) { int digit; if(c >= '0' && c <= '9') digit = c - '0'; else if(c >= 'a' && c <= 'z') digit = c - 'a' + 10; else if(c >= 'A' && c <= 'Z') digit = c - 'A' + 10; // caractere bizzard => erreur else return -1; // est ce que le chiffre est bien dans la base return digit < base ? digit : -1; } // ----------------------------------------------------------- // retourne 0 s'il y a eu une erreur. // aucune gestion des "overflow" int ConvStringToNumber(char *text,int base) { int sign; int n; // L'HISTOIRE DU SIGNE if(*text == '-') { // on passe le '-' text ++; sign = -1; } else { if(*text == '+') { // on passe le '+' text ++; } // dans tous les cas ici on est dans les nombres positifs sign = 1; } // MAINTENANT L'ALGORITHME // il nous faut au moins un chiffre if((n = ConvCharToDigit(*text,base)) < 0) { // ici il y a eu une erreur ! return 0; } // il faut passer le premier chiffre text ++; // ici il faut verifier si on doit // continuer a convertir while(*text != '\0') { int digit; if((digit = ConvCharToDigit(*text,base)) < 0) { // ici il y a eu une erreur ! return 0; } // on rajoute ce nouveau chiffre // on decale (multiplication) et on ajoute le chiffre (addition) n = n * base + digit; // on passe au caractere suivant text ++; } // on renvoie le nombre avec son signe +/- return sign * n; } // ----------------------------------------------------------- int main(int argc,char **argv) { // il ne faut pas que cela valent 0 // sinon on ne peut pas savoir s'il y a des erreurs ! char buf1[32] = "-14567320"; char buf2[32] = "10110"; char buf3[32] = "abcd"; int i; printf("chaines : %20s %20s %20s\n",buf1,buf2,buf3); printf("-------------------------------------------------------------------------------\n"); for(i=2;i<=22;i++) { int resultat; printf("base %2d :",i); // BUF1 if((resultat = ConvStringToNumber(buf1,i)) == 0) printf(" %20s","ERREUR"); else printf(" %20d",resultat); // BUF2 if((resultat = ConvStringToNumber(buf2,i)) == 0) printf(" %20s","ERREUR"); else printf(" %20d",resultat); // BUF3 if((resultat = ConvStringToNumber(buf3,i)) == 0) printf(" %20s","ERREUR"); else printf(" %20d",resultat); printf("\n"); } getch(); return 0; }
--------------------------------------------------------
atof, atoi, _atoi64, atol
Convert strings to double (atof), integer (atoi, _atoi64), or long (atol).
double atof( const char *string );
int atoi( const char *string );
--------------------------------------------------------
bon effectivement il existe une autre fonction qui le fait mais c'est pas atoi
et si tu fais un
atoi(34,result,2)
il me semble que le resultat sera en base 2...
et de même le dernier paramètre peut prendre n'importe quel chiffre/nombre donc la fonction renverra un entier en n'importe quelle base.
pkoi utiliser ton algorithme plutot qu'un atoi ?
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.