Str2long - maj

Soyez le premier à donner votre avis sur cette source.

Vue 2 868 fois - Téléchargée 91 fois

Description

IT is back !

encore plus fort,
encore plus rapide,
encore plus simple,
encore plus beau,
et avec un programmeur encore plus content !

voila le remake de str2long.
j ai rajoute math.h pour les puissances

grand merci a ceux qui m'ont aide a le refaire avec de percieux conseils.

quand j'y repense c'est vrai que ce que j'ai fait c'etait un peu de la mmmm..... (chut c po poli :)

L0L0

Source / Exemple :


#include <stdio.h>
#include <string.h>
#include <math.h> // powaaaaaaaa

// WAAIIIII
// J'ai trouvez comment calculer les puissances
// en titillant math.h
// c'est pow(nombre,exposant);

// pour info les valeur absolues des long
#define SIG_MIN     -2147483648 // signe min
#define SIG_MAX     2147483647   // signe max
#define UNSIG_MIN   0            // pas signe nul
#define UNSIG_MAX   4294967295   // pas signe max

int is_chiffre(char car);
int car_chiffre(char car);
unsigned long chaine_nombre(char *chaine);
int verifier_chaine(char *chaine);

int main(int argc, char *argv[]){
    
    char *chaine = "";  // chaine
    unsigned long nombre; // nombre
    
    printf("note de l'auteur :\n"); // eko
    printf("il n'y a qu'en faisant des erreurs qu'on apprend\n"); // eko
    printf("alors merci a ceux qui on m'ont aide a  'reparer' l'ancienne source"); // eko
        
    if(argc != 2){ // 2 arguments
        printf("utilisation : conv [nombre]"); // eko
        return 0;  // exit
    }
    
    if(!verifier_chaine(argv[1])){ // pas un nombre
        printf("erreur : la valeur doit etre numerique."); // eko
        return 0;  // exit
    }
    
    chaine = argv[1]; // recupere la chaine
    
    printf("Chaine : %s\n", chaine); // eko

    nombre = chaine_nombre(chaine);  // convertir 

    printf("Nombre : %d\n", nombre); // eko
    
}

// fonction de convertisassionnement
unsigned long chaine_nombre(char *chaine){
    
    unsigned long resultat = 0;// nombre final
    unsigned long nombre = 0;  // avant les E10
    int i; // boucle
    int j; // boucle
    int len = strlen(chaine);  // longueur de la chaine

    for(i = 0; i < len; i++){  // pour chaque car
        nombre = 0; // initialise
        // prend la valeur numerique du car en partant de droite
        
        // note :
        // j'ai pas compris :
        // faire un pointeur sur une chaine de caractere 
        // puis l'incrementer au lieu de faire a chaque fois [i]
        nombre = car_chiffre(chaine[len - i - 1]);
        nombre *= pow(10,i); // puissance de 10
        resultat += nombre;  // ajoute
    }

    return resultat; // retourne le nombre final (long)

}

// verifie si tous les caractere sont des chiffres
int verifier_chaine(char *chaine){
    int i; // boucle
    for(i = 0; i < strlen(chaine); i++){ // pour chaque car
        if(!is_chiffre(chaine[i])){      // si pas chiffre
            return 0; // bye ...
        }
    }
    return 1;
}

// verifie si le caractere est un chiffre
int is_chiffre(char car){
    if(car >= '0' && car <= '9'){
        return 1; // oui
    }else{
        return 0; // non
    }
}

// convertion du caractere en chiffre
int car_chiffre(char car){
    // wesh merci a JCDjcd
    // ca c'est un truc auquel j'aurai jamais pense
    
    // comme on a deja verifie que c'est un chiffre
    // on retourne la valeur du car moins celle de 0
    return car - '0';
}

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
unsigned long chaine_nombre(char* source)
{
char *c = source;
unsigned long n = 0;
while(*c >= 48 && *c <= 57) {
n *= 10;
n += (*c - 48);
c++;
}
return n;
}

ciao...
Messages postés
24
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
26 septembre 2003

cool ! Merci pour tout ces commentaire !
ca fait plaisir et ca motive! :-D
note : je ne savais pas que atol(); existait ...
on m'avait parle que de atoi();

je sais que j'ai un peu abuse avec les switch (lol :)
et que les break; apres return ca sert pas vraiment ...

les 2 boucle pour convertir une chaine en nombre c'est pour les puissance 10 et je sais pas faire les puissances en c !
selon sa position il multiplie par 10

promis je refais ca tout de suite.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
donc maintenat qu'on t'a tout dit,
nouveau cahier des charges:
unsigned long chaine_nombre(char *chaine){
unsigned long nombre = 0; // nombre final
// AUCUN strlen utile
// AUCUN appel de fonction externe
// 1 SEULE boucle par pointeur et valeur directe en sortie

return nombre; // retourne le nombre final (long)
}

Nous attendons la nouvelle mouture.
ciao...
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Les 'break' juste apres des 'return' c'est super util !

Et je ne comprend pas pourquoi tu as besoin de 2 boucles pour convertir une chaine en un monbre ?
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
nombre = nombre + nombre_temp; // ajoute

Ca se programme :
nombre += nombre_temp; // ajoute
Afficher les 9 commentaires

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.