View Full Version : [C]Convertire un intero in una stringa
Salve, esiste una funzione (tipo l'inversa di quella che cerco, cioè atoi) che mi permetti di convertira un intero in una strnga???
grazie
l'itoa esiste ma non è portabile; se anziché C puoi usare C++ è meglio, basta che metti il numero in uno stringstream, altrimenti devi fare la stessa cosa ma in C tramite sprintf.
variabilepippo
31-05-2008, 14:31
itoa?
l'itoa esiste ma non è portabile; se anziché C puoi usare C++ è meglio, basta che metti il numero in uno stringstream, altrimenti devi fare la stessa cosa ma in C tramite sprintf.
No, posso usare solo il C. Cmq in che senso non è portabile?
cmq ho trovato questa implementazione:
char *itoa(int n, char *s)
{
int i, sign;
if ((sign = n) < 0) /* tiene traccia del segno */
n = -n; /* rende n positivo */
i = 0;
do { /* genera le cifre nell'ordine inverso */
s[i++] = n % 10 + '0'; /* estrae la cifra seguente */
} while ((n /= 10) > 0); /* elimina la cifra da n */
if (sign < 0)
s[i++] = '-';
s[i] = '\\0';
reverse(s);
return s;
}
void reverse(char *s)
{
int c, i, j;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
Si potrebbe usare quella invece che la semplice itoa(...): no? cosi si dovrebbe risolvere il problema
DanieleC88
31-05-2008, 15:01
Vabbe' che la si poteva pure fare senza rigirare niente, ma se esiste sprintf(), usala, fai immensamente prima e non re-inventi la ruota (http://en.wikipedia.org/wiki/Reinventing_the_wheel). :D
ciao ;)
itoa? già, eccola qua:
http://msdn.microsoft.com/en-us/library/yakksftt(VS.80).aspx
No, posso usare solo il C. sprintf allora.
Cmq in che senso non è portabile? nel senso che non ce l'hanno tutti i compilatori.
DanieleC88
31-05-2008, 15:23
Più che altro nel senso che non è standard. :D
si vabbè, quello intendevo :O
DanieleC88
31-05-2008, 15:31
si vabbè, quello intendevo :O
Be', non dimenticare che io sono ballbreaker™. :D
E poi precisavo perché c'è una differenza tra le due cose, non è un difetto dei compilatori che hanno scelto di implementare o non implementare tale chiamata, è che proprio non è parte del linguaggio, quindi è solo un'estensione proprietaria.
Lo so che tu lo sai, ma preciso per eventuali lettori occasionali, che non devono fare confusione. ;)
maulattu
31-05-2008, 17:23
meglio, direi di usare la snprintf
esempio:
...
int i = 45;
char string[10];
snprintf(string, sizeof(string), "%d", i);
/* metto il finestringa */
string[sizeof(string) - 1] = 0;
...
è buona abitudine usare le funzioni robuste...
al posto di strtok è meglio usare strtok_r (è reentrant), idem per la ctime (c'è la ctime_r)...
DanieleC88
31-05-2008, 17:26
:wtf:
Che ho detto di male? :D
maulattu
01-06-2008, 10:00
:wtf:
Che ho detto di male? :D
la sprintf non è robusta, esempio:
int i= 12345;
char string[2];
sprintf(string,"%d", i);
ed ecco un bella sfondata di memoria in cui vai a scrivere in un'area di memoria magari di un'altra variabile (se ti va bene) o, peggio ancora, di un altro programma (con il classico segmentation fault)
quindi alla fine meglio che mi creo io una funzione (come quella che ho postato) invece di usare itoa oppure sprintf......no?
maulattu
01-06-2008, 10:27
quindi alla fine meglio che mi creo io una funzione (come quella che ho postato) invece di usare itoa oppure sprintf......no?
no no,
la snprintf va più che bene!!!
ho sottolineato il fatto che la snprintf è più robusta della sprintf, tutto qui.
usala pure che funziona egregiamente
http://it.wikipedia.org/wiki/Printf#sprintf
no no,
la snprintf va più che bene!!!
ho sottolineato il fatto che la snprintf è più robusta della sprintf, tutto qui.
usala pure che funziona egregiamente
http://it.wikipedia.org/wiki/Printf#sprintf
ah ok :D allora grazie!
DanieleC88
01-06-2008, 12:11
la sprintf non è robusta, esempio:
int i= 12345;
char string[2];
sprintf(string,"%d", i);
ed ecco un bella sfondata di memoria in cui vai a scrivere in un'area di memoria magari di un'altra variabile (se ti va bene) o, peggio ancora, di un altro programma (con il classico segmentation fault)
LOL, scusa, il mio post era rivolto a 71104, solo che mentro lo scrivevo hai postato il tuo, e così s'è creata la confusione. ;)
All'università ci stanno facendo studiare proprio adesso degli esempi anche banali su come può essere fatto uno stack smashing usando un buffer overflow, figurati se contestavo il tuo post. :D
la sprintf non è robusta, esempio:
int i= 12345;
char string[2];
sprintf(string,"%d", i);
1) come già detto esiste snprintf
2) non è che le dimensioni della rappresentazione testuale di un intero siano tanto ignote eh :rolleyes:
ed ecco un bella sfondata di memoria in cui vai a scrivere in un'area di memoria magari di un'altra variabile (se ti va bene) o, peggio ancora, di un altro programma (con il classico segmentation fault) ma studiati un po' di memoria virtuale, niubboh :asd:
:wtf:
Che ho detto di male? :D
niente, è che stimo troppo la tua pignoleria :D
maulattu
01-06-2008, 18:04
LOL, scusa, il mio post era rivolto a 71104, solo che mentro lo scrivevo hai postato il tuo, e così s'è creata la confusione. ;)
All'università ci stanno facendo studiare proprio adesso degli esempi anche banali su come può essere fatto uno stack smashing usando un buffer overflow, figurati se contestavo il tuo post. :D
ok, figurati ... non c'è nessunissimo problema :)
maulattu
01-06-2008, 18:09
1) come già detto esiste snprintf
2) non è che le dimensioni della rappresentazione testuale di un intero siano tanto ignote eh :rolleyes:
ma studiati un po' di memoria virtuale, niubboh :asd:
Magari uno ha la necessità di memorizzare in una stringa nmila interi...
e se sbagli a fare i conti puoi fare porcate...:rolleyes:
ma studiati un po' di memoria virtuale, niubboh
e se il famoso "altro programma" (meglio dire altro eseguibile) è in un altro segmento?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.