STR2LONG - MAJ

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 19 juin 2003 à 22:46
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 juin 2003 à 18:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10955-str2long-maj

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 juin 2003 à 18:07
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...
cs_Skyman Messages postés 24 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 26 septembre 2003
20 juin 2003 à 12:37
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.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2003 à 10:17
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...
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
20 juin 2003 à 10:06
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 ?
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
20 juin 2003 à 10:03
nombre = nombre + nombre_temp; // ajoute

Ca se programme :
nombre += nombre_temp; // ajoute
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
20 juin 2003 à 10:02
Ah oui, tu pourrais faire un pointeur sur une chaine de caractere puis l'incrementer au lieu de faire a chaque fois [i] !
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
20 juin 2003 à 10:00
Voici comment reprogrammer des fonctions !!!
***************************
int is_chiffre(char car)
{
return (car >= '0' && car <= '9');
}
***************************
He oui en une ligne, et infiniment plus rapide !

La seconde fonction :
*****************************
int car_chiffre(char car)
{
return car - '0';
}
***********************
He oui encore une ligne et encore infiniment plus rapide !



Il ne faut pas utiliser les switch a gogo !
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
20 juin 2003 à 02:51
et aussi, essaie de ne pas appeler strlen à toute les fois, stocke la longueur de la chaine dans une var, ca va être beaucoup, beaucoup, beaucoup, beaucoup, beaucoup, .... plus rapide!!!

dans ton for(), strlen est appeler à chaque tour de boucle donc il doit recalculer la longueur de la chaine à chaque fois ...

et en passant, je dit ca comme ca mais il existe pas seulement atoi() pour les int ... il y à aussi atol() pour les long ... atof() pour les double etc ... et si je peut me permettre, il y à une facon beaucoup beaucoup plus rapide et courte de faire ce genre de convertion ...



~(.:: NitRic ::.)~
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juin 2003 à 22:46
atoi() retourne un 32 bits signe et non 8 bits.
Faudrait aussi nettement ameliorer ton algo, car_chiffre(char car) est une calamite.
Je te laisse trouver pourquoi. Au boulot.
ciao...
Rejoignez-nous