Programmation.c++ : conversion d'un entier en chaîne?
Posté par goret2 () le 02 juin 2007
bonjour,
je cherche comment faire une conversion d'un entier en une chaîne de caractères ou alors comment affecter un entier à une chaîne par exemple :
int numero;
char* chaine; comment affecter "numero" à "chaine"??
merci.
je cherche comment faire une conversion d'un entier en une chaîne de caractères ou alors comment affecter un entier à une chaîne par exemple :
int numero;
char* chaine; comment affecter "numero" à "chaine"??
merci.
> Lire le message (8 commentaires, moyenne: 2,1).
Vous avez demandé le commentaire #837902.



Google n'est pas ton ami ?
Tu pourrais faire l'effort de lire un des nombreux tutoriels C/C++ disponibles sur le net avant de poster ici !
Tu peux faire : sprintf(chaine,"%d",numero);
à condition bien sûr que tu aies alloué pour la chaîne un nombre de caractères suffisant pour tous les chiffres de ton entier.
Tu peux en outre contrôler le format (cadrage à gauche, compléter par des zéros...) : man sprintf
[^]Re: Google n'est pas ton ami ?
Je dirai même plus : utilise snprintf(). De cette façon, tu seras sûr que tu n'auras pas de débordement de tampon, même si tu n'as pas alloué une taille suffisante. snprintf() est conforme C99, et il est présent sur la plupart des systèmes.
Je te laisse trouver comment calculer le nombre de chiffres d'un entier :-) (indice : log).
Si la portabilité n'est pas un problème, utiliser asprintf() permet de ne pas se casser la tête avec l'allocation mémoire. Mais c'est une extension GNU, donc seulement glibc.
[^]Re: Google n'est pas ton ami ?
on peut facilement recoder asprintf, et au passage, on peut meme l'ameliorer au niveau de l'API.
char* strdup_(char* input)
{
char* ret = strdup(input);
if (ret == NULL) {
fprintf(stderr, "Out of memory, exiting - input was %s.\n", input);
exit(EXIT_FAILURE);
}
return ret;
}
char * vasprintf_(const char *msg, va_list args)
{
char s[8192];
vsnprintf(s, sizeof(s), msg, args);
return strdup(s);
}
// _GNU_SOURCE's asprintf like, but
// - doesn't need _GNU_SOURCE
// - returns allocated string
// - never returns NULL (prints failure and exit on out of memory)
char * asprintf_(const char *msg, ...)
{
char * results;
va_list arg_ptr;
va_start(arg_ptr, msg);
results = vasprintf_(msg, arg_ptr);
va_end(arg_ptr);
return results;
}
[^]Re: Google n'est pas ton ami ?
Oui, ça se recode facilement - par contre, l'implém que tu donnes est pas forcément la meilleure... Notamment pour l'allocation en bloc de 8192 au lieu d'une allocation dynamique comme le fait l'asprintf() de la glibc.
Par ailleurs, je suis pas persuadé que retourner la chaîne plutôt qu'un int soit une bonne chose ; il est intéressant d'avoir la taille allouée en retour... (Et puis, pour quelqu'un qui est habitué à coder du GNU, c'est une abomination d'avoir autre chose qu'un int retourné, de toutes façons :-P).
http://www.gnu.org/software/gnulib/ fournit une version portable de asprintf() ainsi que de pas mal d'autres fonctions GNU, notamment les très pratiques error(), getline() et getdelim(). La bibliothèque fonctionne pour Windows, HP-UX, AIX, *BSD, Solaris et bien d'autres.
[^]Re: Google n'est pas ton ami ?
l'implém que tu donnes est pas forcément la meilleure... Notamment pour l'allocation en bloc de 8192 au lieu d'une allocation dynamique comme le fait l'asprintf() de la glibc.
c'est certes une implémentation qui me convient, tu peux te faire un peu plus chevrer et être plus dynamique mais concrètement comme ça, ça me va très bien.
Par ailleurs, je suis pas persuadé que retourner la chaîne plutôt qu'un int soit une bonne chose ; il est intéressant d'avoir la taille allouée en retour... (Et puis, pour quelqu'un qui est habitué à coder du GNU, c'est une abomination d'avoir autre chose qu'un int retourné, de toutes façons :-P).
c'est dommage, le fonctionnel saibien(tm).