// convertir.cpp Conversions et utilitaires
// (auteur: R.Astier)
// 1. conversion chaîne de caractères vers entier(int)
// obtenir la valeur numérique
// 2. conversion chaîne de caractères vers décimal(double)
// obtenir la valeur numérique
// 3. conversion d'un entier (long) vers une chaîne
// obtenir la suite de caractères
// 4. conversion d'un double vers une chaîne
// obtenir la suite de caractères
// 5. chiffres d'un entier positif
// obtenir la suite des chiffres dans une base fournie
// 6. suppression d'espaces non significatifs
// 7 partie utile d'une chaîne de caractères
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
#include
#include
#include
#include
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
// 1. Conversion chaîne de caractères vers entier(int)
// ---------------------------------------------------
// Renvoie vrai si cc représente un nombre entier (int)
// (des espaces avant et après le nombre sont autorisés).
// Exemples:
// entiers(int): "8", "-8", " +123", "2147483647"(maximum)
// non int : " ", "8-", " 12Z3", "2147483649"(dépassement)
int estEntier(const char cc[], long &v) {
const int BASE=10;
int iFin; // délimite la partie utile
char *pFin;
// Trouver premier caractère espace en partant de la fin
for(iFin=strlen(cc); iFin>0 && isspace(cc[iFin-1]); iFin--);
// Les cas 1.chaine absente, 2.vide, 3.que des espaces:
if(cc==NULL || cc[0]=='\0' || iFin==0) return 0;
// Conversion, puis on teste que la conversion se fait jusqu'au bout des
// caractères de la chaîne, puis que la capacité n'est pas dépassée
v=strtol(cc,&pFin,BASE);
int entier = (cc+iFin==pFin);
if(entier) {
double d=strtod(cc,NULL);
entier = (v==d); // ? dépassement de capacité
}
return entier;
}
// 2. Conversion chaîne de caractères vers décimal(double)
// -------------------------------------------------------
// Renvoie vrai si cc représente un nombre décimal (double)
// (des espaces avant et après le nombre sont autorisés).
// Exemples:
// décimaux(double): "8", "-.8", " .8", ".8e4", " -.8e-5"
// non décimaux : " ", "8-", " . 5", ".5 a ", ".5e 2"
int estDecimal(const char cc[], double &v) {
int iFin; // pour délimiter la partie utile
char *pFin;
// Trouver premier caractère espace en partant de la fin
for(iFin=strlen(cc); iFin>0 && isspace(cc[iFin-1]); iFin--);
// Les cas 1.chaine absente, 2.vide, 3.que des espaces:
if(cc==NULL || cc[0]=='\0' || iFin==0) return 0;
// Conversion, puis on teste que la conversion se fait jusqu'au bout des
// caractères de la chaîne
v=strtod(cc,&pFin); // conversion du langage (trop laxiste)
int decimal = (cc+iFin==pFin);
return decimal;
}
// 3. Conversion d'un entier vers une chaîne
// -----------------------------------------
void chaine_c(long e, char cc[80]) {
int posp, signe;
char *pc=cc, *pchif=fcvt(e,0,&posp,&signe);
if(signe==1) {*pc='-'; pc++; }
strncpy(pc,pchif,posp);
pc[posp]='\0';
strcat(pc+posp,pchif+posp);
}
// 4. Conversion d'un double vers une chaîne
// -----------------------------------------
// ncav: nombre de chiffres après la virgule
void chaine_c(double v, int ncav, char cc[80]) {
const char SEPDECIMAL='.';
int posp, signe;
char *pc=cc, *pchif=fcvt(v,ncav,&posp,&signe);
if(signe==1) {*pc='-'; pc++; }
if(posp<=0) {*pc='0'; pc++; }
if(posp>=0) {
strncpy(pc,pchif,posp);
pc[posp]=SEPDECIMAL; pc[posp+1]='\0';
strcat(pc+posp+1,pchif+posp);
}
else {
*pc=SEPDECIMAL;
for(int i=1;i<=-posp; i++) pc[i]='0';
pc+=1-posp; *pc='\0';
strcat(pc,pchif);
}
}
// 5. Chiffres d'un entier positif, dans une base fournie
// ------------------------------------------------------
// Exemples:
// nc=chiffres(17,tc) ==> nc=2, tc={1,7}
// nc=chiffres(257,tc) ==> nc=3, tc={2,5,7}
// nc=chiffres(17,tc,2) ==> nc=5, tc={1,0,0,0,1}
// nc=chiffres(267,tc,16) ==> nc=3, tc={1,0,11}
// Condition d'emploi: e>=0, base>1
int chiffres(int long e, int tc[32], int base=10) {
int i,aux=e,nc=0; // nc=nombre de chiffres
// Extraire les chiffres par divisions successives
do {
tc[nc]=e%base;
nc++;
e=e/base;
} while(e>0);
// Rétablir l'ordre naturel, par inversion du tableau
for(i=0; 2*i0 && isspace(cc[jj-1]); jj--);
cc[jj]='\0';
}
// 7. Partie utile d'une chaîne de caractères
// ------------------------------------------
// Indices délimitant la partie utile d'une chaîne
// ip = indice du premier caractère non espace
// id = indice du premier espace qui termine
// " abc " ip=1; id=4;
// "a c " ip=0; id=3;
// Condition: cc!=NULL
void gererEspaces(const char cc[],int & ip, int & id ) {
// Trouver indice du premier caractère non espace
for(ip=0; cc[ip]!='\0' && isspace(cc[ip]); ip++);
// Trouver indice du premier espace qui termine cc
for(id=strlen(cc); id>ip && isspace(cc[id-1]); id--);
}
// - - - - - - - Q u e l q u e s u t i l i s a t i o n s - - - - - +
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
int main( int nm, char *mots[]) {
/* Test gererEspaces
char cc[80],tc[80],*p;
int id,ip;
p="abcdef"; strcpy(tc,p);strcpy(cc,p);
gererEspaces(p,ip,id); gererEspaces(cc);
cout<<"1 tc='"< chaîne (fonction chaine_c)
int e; char ce[80];
e=0; chaine_c(e,ce); cout< chaîne (fonction chaine_c)
double y; char cy[80];
cout.width(11);cout<<"numérique"<<" chaine"<10 nu="<10 nu="<10 nu="<10 nu="<10 nu="<2 nu="<2 nu="<2 nu="<2 nu="<16 nu="<16 nc="< > > "; cin.getline( new char[80],80);
return 0;
} //fin convertir.cpp