2010-04-15 11 views
1

Ceci est une très très question fondamentale et je sais une façon est de faire ce qui suit:convertir un int en char *

char buffer[33]; 
itoa(aq_width, buffer,10); 

où aq_width est l'int, mais je ne peux pas garantir ce que la taille de tampon que je aurais besoin pour faire cela ... Je peux toujours allouer une très grande taille de tampon, mais ce ne serait pas très agréable ... toute autre manière simple et jolie de le faire?

+6

Les réponses sont assez différentes pour C et C++, dans quelle programmation? –

Répondre

4
std::stringstream ss; 
ss << 3; 
std::string s = ss.str(); 
assert(!strcmp("3", s.c_str())); 
+0

ou 'assert (" 3 "== s);' – user102008

0

Une fonction agréable de glibc est asprintf, utilisé comme

char * buffer = NULL; 
int buffer_size = asprintf(&buffer,"%d",aq_width); 
assert(buffer_size >= 0); 
... 
free(buffer) 

qui allouera la mémoire tampon pour vous.

Plus portably, vous pouvez utiliser snprintf, qui renverra le nombre de caractères que vous devez allouer.

+0

S'il utilise 'itoa', il n'utilise probablement pas la glibc ... –

0

Il y a plus de façons efficaces de mémoire de le faire, mais ils ne sont pas "simples".

Considérez le coût de 100 octets de mémoire pour, disons, une seconde. Un gigaoctet pour une durée de dix ans coûte, quoi, 10 $? Nous parlons nanocents ici.

Rend le tampon trop grand. Notez qu'un int 32 bits ne peut pas comporter plus de 10 chiffres en décimal et un entier 64 bits ne peut pas être supérieur à 20.

2

Vous pouvez calculer une limite supérieure pour la taille requise de tampon à l'aide de cette macro (pour les types signés):

#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type) - 1)/3 + 2) 

par ailleurs, itoa() n'est pas standard C et est pas disponible partout. snprintf() fera le travail:

char buffer[MAX_SIZE(aq_width)]; 
snprintf(buffer, sizeof buffer, "%d", aq_width);