Convertion : chaine => nombre (base quelconque)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 311 fois - Téléchargée 34 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

Messages postés
6
Date d'inscription
samedi 23 octobre 2004
Statut
Membre
Dernière intervention
4 novembre 2010

comment faire la meme chose sous VB6?
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
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
Messages postés
19
Date d'inscription
lundi 10 juin 2002
Statut
Membre
Dernière intervention
5 juin 2005

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.
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Tout simplement que le atoi conertie une chaine ecrite en base 10, et non en base quelconque !
Messages postés
855
Date d'inscription
mardi 19 novembre 2002
Statut
Membre
Dernière intervention
28 juillet 2009
1
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.