Itoa fait masion: coversion entier 32 bit non signe vers chaine de caractere(unix/win32)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 977 fois - Téléchargée 18 fois

Contenu du snippet

permet la conversion d'un entier non signe 32 bits vers une une chaine de caractère ; la fonction est quasiment indisponible sous UNIX ( on a pas trouvé une alternative thread-safe apparemment), j'ai décidé d'implémenter mon propre code qui compile sous Win32/UNIX dont voila le prototype;

char *Uint32ToString(uint32_t NB,size_t *StrLen);

NB : l'entier non signe a convertir;
StrLen : ptr donnant la taille de la chaine de retour

Source / Exemple :


#ifdef _WIN32
typedef unsigned int uint32_t ;
typedef unsigned int size_t;
#else
#include <sys/types.h>
#endif
char *Uint32ToString(uint32_t NB,size_t *StrLen)
{
	 static char buf[32];
	unsigned char *s = (unsigned char *)(buf + sizeof(buf) - 1);

	if( StrLen ){

  • StrLen = 1;
} for(;;){ if( NB < 10 )break ; *s = ( NB % 10 ) + '0' ;*s--; if( StrLen ) { (*StrLen)++; } NB /= 10 ; }
  • s = NB + '0' ;
return s; } #include <stdio.h> int main() { size_t len; printf("%s ",Uint32ToString(655841,&len)); printf("taille %d\n",len); printf("%s\n",Uint32ToString(6584,NULL)); printf("%s\n",Uint32ToString(95783,NULL)); printf("%s\n",Uint32ToString(3267,NULL)); return 0; }

Conclusion :


le code n'est pa thread-safe sous UNIX puisque il retourne un ptr vers une chaine statique (static buf[]) , donc si quelqu'un a une idée d'alternative thread-safe ca serait génial.

A Vos Les Studios ==>

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
24
ben enfin, si tu fournis le buffer destination dans lequel la fonction écrit, le problème de thread safe ne se pose plus.
C'est exactement ce que fait bnultoa() dans quasi tous mes codes.
Messages postés
32
Date d'inscription
vendredi 26 mai 2006
Statut
Membre
Dernière intervention
14 avril 2009

BrunNews:
Franchement je suis très curieux de voir ton code 100% Thread-safe , Full reentrant .
allez champion j'attends ;-)
Messages postés
130
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
14 mars 2009

Est-ce que, tout simplement,
char *Uint32ToString(unsigned long NB,size_t *StrLen)
{
static char buf[32];
size_t length=sprintf(buf,"%lu",NB);
if(StrLen)
{
*StrLen=length;
}
return buf;
}

ne suffit pas ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
char* MyUltoa(unsigned int v, char *pdst);
voila du thread safe.

Retourne ausi le pointeur sur fin d'écriture, ça le rendra moins con que l'original.

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.