Convertion : chaine => nombre (base quelconque)

Contenu du snippet

Le but est de tranformer une chaine de caractere qui represente un nombre en base quelconque, de le convertir en ce nombre.

Source / Exemple :


#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;
}

A voir également

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.