begin process at 2012 05 27 15:54:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > ÉCRITURE DE ITOA

ÉCRITURE DE ITOA


 Information sur la source

Note :
Aucune note
Catégorie :Chaîne de caractères Classé sous :itoa, linux, alternative, chaine, int Niveau :Débutant Date de création :14/06/2007 Date de mise à jour :16/06/2007 09:35:28 Vu / téléchargé :7 234 / 243

Auteur : thomwebster

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 Description

Comme le titre l'annonce, voici mon implémentation de la fonction itoa.
Cette fonction n'étant pas standard, j'ai décidé de l'écrire et de la mettre a disposition des personnes qui ont un compilateur n'ayant pas la fonction itoa (exemple: sous linux aucun compilateur ne l'accèpte, dev cpp ne l'accèpte pas par défaut). Cette source n'est pas la source finale. Il me reste la phase de test, de comparaison avec la fonction itoa existante en terme de performance ainsi que la phase d'optimisation si possible. J'ai déja quelques idées...


 Conclusion

Tout est dans le zip, la source est bien commentée, il y a une main pour montrer l'utilisation de la fonction...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   itoa
    • itoa.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 702 octets
    • itoa.c~Télécharger ce fichier [Réservé aux membres club]1 703 octets
    • itoa.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier175 octets
    • itoa.h~Télécharger ce fichier [Réservé aux membres club]196 octets
    • main.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier289 octets
    • main.c~Télécharger ce fichier [Réservé aux membres club]263 octets
    • MakefileTélécharger ce fichier [Réservé aux membres club]233 octets
    • Makefile~Télécharger ce fichier [Réservé aux membres club]216 octets
    • Projet itoa_lin.devTélécharger ce fichier [Réservé aux membres club]1 075 octets

Télécharger le zip


 Historique

14 juin 2007 12:17:41 :
Séparation de la main dans un fichier main.c, cela aurait dû être fait depuis le debut, désolé...
14 juin 2007 13:07:57 :
Correction du bug pour itoa(0) + base à 10 par défaut, le 3ème paramètre devient optionnel si on veut etre en base 10
14 juin 2007 13:33:12 :
Rajout du mot static comme conseillé :p
14 juin 2007 14:41:11 :
le pointeur retourné est maintenant le pointeur qui pointe sur le \0 de fin de la chaine obtenue. La suite arrivera dans un peu plus longtemps certainement...
15 juin 2007 14:07:03 :
- J'ai enlever la base 10 par défaut car en C on ne peut pas mettre de valeur par défaut dans les fonctions, ce n'est valable qu'en C++, or ma source est destinée aux développeur C et C++ - Création du Makefile pour linux. - system("PAUSE"); en commentaire dans main.c à décommenter pour WINDOWS
16 juin 2007 09:35:29 :
-J'ai enlever la base 10 par défaut car seul le C++ suporte les arguments par défaut, contrairement au C or ma source est destinée aux programmeurs C et C++ -Création du makefile pour linux -La prochaine étape sera d'écrire directement dans le chaine dans le bon sens, pour ne pas avoir a la retourner ensuite...

 Sources de la même categorie

CALCUL DE CLEF RIB par Renfield
Source avec Zip [C] WD_STRING V2.2 par cyberripper
Source avec Zip LES STRING EN C, AFFECTATION, CONCATÉNATION, SPLIT, ... par appranting
Source avec Zip [C] WD_STRING V1.9 par cyberripper
Source avec Zip LIBRAIRIE LANGUAGES par astro53

 Sources en rapport avec celle ci

Source avec Zip TRAITEMENT D'IMAGE PGM par Jios
Source avec une capture COLORIMÈTRE NUMÉRIQUE LINUX par valchek
Source avec Zip Source avec une capture SOKOBAN EN C POUR DÉBUTANT (VERSION AMÉLIORÉE BASÉE SUR LE T... par eustatika
ITOA FAIT MASION: COVERSION ENTIER 32 BIT NON SIGNE VERS CHA... par xtremejames183
ALTERNATIVE À LA FONCTION ITOA par Pamaury

Commentaires et avis

Commentaire de acx01b le 14/06/2007 12:21:36

salut

à mon avis tu pourrais renvoyer un int : le nombre de caractère écrits au lieu de renvoyer un char *

et tu pourrais aussi écrire directement à l'envers dans chaine comme ça tu pourrais copier chaine dans resultat avec un memcpy

ton const char num devrait être déclaré static ?

pour mettre le signe moins tu fais deux tests un seul suffirait

tu utilises des indices sur tes pointeurs, alors que tu pourrais directement incrémenter et décrémenter les pointeurs, ça simplifirait le travail d'optimisation du compilateur

la macro MAX je la mettrais à 64 au moins ça ne coûte rien

et enfin il y a un bug quand on fait itoa de 0

a+

Commentaire de thomwebster le 14/06/2007 12:49:03

Merci beaucoup pour ton commentaire, je vais me pencher dessus, et corriger tout ça...
Concernant le double test j'ai besoin de deux test de toute façon puisque d'après la doc que j'ai lu itoa ne gère que les entiers négatifs si la base est égal à 10... mais je vais les imbriquer, ça ,ne posera pas de problème. Pour le mot clé static peux tu me dire ce qu'il apporterait? à vrai dire c'est un mot clé que je n'utilise pas car je ne connais pas vraiment sa signification exacte...
Merci :)

Commentaire de acx01b le 14/06/2007 13:07:13

salut

static est très simple: une variable déclarée static c'est une variable "globale" acessible que dans le fichier, la fonction, ou le bloc où tu l'as déclarée

c'est à dire qu'elle ne sera pas localisée dans la pile, et donc elle ne sera pas crée au début de la fonction et détruite à la fin de la fonction

par exemple:

int func() {
   static int k = 0;
   return k++;
}

printf(" %d ",func()); // 0 : premier appel
printf(" %d ",func()); // 1
printf(" %d ",func()); // 2
printf(" %d ",func()); // 3
...

Commentaire de thomwebster le 14/06/2007 13:14:56

D'accord, merci beaucoup pour ces précisions! C'est très gentil de ta part.
J'ai corriger le bug pour itoa de 0.
Pour l'écriture de la chaine à l'envers directement j'avais prévu de le faire...
Ce sera fait le plutot possible je l'espère parsque retourner la chaine comme je l'ai fait, c'est loin d'etre optimal...

Commentaire de thomwebster le 14/06/2007 13:38:36

Je ne vois pas l'utilité de renvoyer le nombre de caractères écrits... Une chaine, ça se parcours jusqu'à trouver '\0' donc il est inutil de renvoyer le nombre de caractères écrits... De plus c'est une écriture de la fonction itoa, j'ai donc respecté le typage de cette fonction...

Commentaire de BruNews le 14/06/2007 14:06:36 administrateur CS

itoa() dans sa version ordinaire est ce qu'on pourrait appeler 'tout terrain' par le fait qu'il y a le param 'base' (3eme). On peut considérer que c'est utile si on fait un appel itoa de temps en temps pour un affichage mais ça devient une vraie nuisance si on a besoin de performance comme dans du reporting ou truc de ce genre qui doit convertir des milliers ou millions de nombres dans un buffer. Retourner le char* qu'on lui passe est une autre ineptie puisqu'on le connait, nous intéresserait mieux le pointeur sur fin d'écriture pour chainage direct sans reparcours de la chaine.

Commentaire de thomwebster le 14/06/2007 14:09:44

Donc si j'ai bien compris, ce qu'il faut que je retourne, c'est le pointeur qui pointe sur le '\0' de ma chaine?

Commentaire de Renfield le 14/06/2007 14:10:25 administrateur CS

ouaip...


me rappelle bnitoa tes remarques, BruNews (étrange, non ^^)

voir:

http://www.cppfrance.com/codes/SPEED-POUR-ULTOA-ITOA-WIN32-VCPLUSPLUS-ASM_10349.aspx

Commentaire de BruNews le 14/06/2007 14:19:33 administrateur CS

ben oui, si j'écris (ou REécris) une fonction, c'est pour obtenir le mieux possible. Si sprintf me suffit, aucun besoin de fonction perso.

A quoi sert la chaine[MAX] dans ta fonction ???
void ReverseStr(char *psz)
{
  char *c = psz, a;
  while(*c) c++;
  while(psz < --c) {a = *psz; *psz++ = *c; *c = a;}
}
quan on voit que le renversement se limite à "while(psz < --c)" autant écrire direct sur le buffer passé en param, sans compter qu'on s'épargne le count inutile en ce cas.

Commentaire de BruNews le 14/06/2007 14:21:56 administrateur CS

oui, pointeur sur le NULL final de chaine.
ça permet:
char buf[40];
itoa(n2, itoa(n1, buf));
par exemple, benef du strcat (à la con, chuuutttt).

Commentaire de BruNews le 14/06/2007 14:25:41 administrateur CS

Une dernière avant ce soir:
renomme les fonctions spécialisées:
twitoa(), twultoa(), twtohex(), etc...
évitera confusion avec itoa() standard.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

int => chaine de caractères ? [ par kjus ] vala, il me faudrait transformer une variable int en chaine de caractère.Y a-t-il une fonction toute faite ?en fait, mon but est de l'inscrire dans un Problème de code en c++ (fonction itoa) [ par mimyne ] voila g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[2]; if (pSender == Btnres) { { ito help :: String => Int [ par Skyman ] Comment on fait pour changer un string en int ou en long ?ex :char *chaine;int entier;long entierlong;chaine = "1234";int = chaine; // (int = 1234) Algo trop lent :( [ par MoDDiB ] Bon tout d'abord je tient à préciser qu'il s'agit du concours prologin auquel je compte participer donc si certaines personnes ne veulent pas m'aider Linux, C & Sockets [ par cbismuth ] Bonjour! Je pense devenir fou...Je programme actuellement une architecture serveur/client en C.Le problème est que pour tous les clients qui se conne Separer une chaine en sous chaine [ par firemax ] Bonjour Je me posais une question , j'aimerais diviser une chaine en sous chaine pour pouvoir ensuite les trier par longueur de chaine de caractere Modifier un caractere dans une chaine [ par floche ] Bonjours &#224; tous Le titre est assez explicite... Je voudrais pouvoir changer un caractere d une chaine si c'est un a mais ca ne marche pas. Merci transformer un int en chaine de caractère [ par lenneth666 ] Voila j'ai comme code ceci char *tmp2=(char *)malloc(5000); int res = 15; je voudrais savoir comment mettre res dans tmp2 le cast ne marche pas, et convertir des chaine en type int [ par super ienien ] comment convertit on des chaine de type char en type entier ou inversementmeci d'avance decoupage par delimitation [ par sheorogath ] bjr a tous,je voudrai savoir si un fonction equivalente a StringTokenizer de java existye en cppa savoir que cette fonction permet de decomposer une c


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,404 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales