Convertion : chaine => nombre (base quelconque)

0/5 (5 avis)

Snippet vu 4 545 fois - Téléchargée 36 fois

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

Ajouter un commentaire Commentaires
cs_obionekenobi Messages postés 6 Date d'inscription samedi 23 octobre 2004 Statut Membre Dernière intervention 4 novembre 2010
23 oct. 2004 à 19:00
comment faire la meme chose sous VB6?
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
23 oct. 2004 à 14:51
MSDN :
--------------------------------------------------------
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
cs_Catman Messages postés 19 Date d'inscription lundi 10 juin 2002 Statut Membre Dernière intervention 5 juin 2005
20 oct. 2004 à 20:32
ha bon ?
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.
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
21 juin 2003 à 07:39
Tout simplement que le atoi conertie une chaine ecrite en base 10, et non en base quelconque !
davwart Messages postés 855 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 28 juillet 2009 1
20 juin 2003 à 23:57
heu... oui mais...
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.