Volendo creare una stringa che contenga, ad esempio 3 interi scritti in sequenza secondo la notazione decimale (Secondo questo formato quindi: "%d%d%d") come occorre allocare (Dinamicamene) il buffer per la stringa da creare ?
Volendo creare una stringa che contenga, ad esempio 3 interi scritti in sequenza secondo la notazione decimale (Secondo questo formato quindi: "%d%d%d") come occorre allocare (Dinamicamene) il buffer per la stringa da creare ?
Intanto la stringa di formattazione e' bene che sia "%d %d %d" in modo da separare i 3 valori almeno con uno spazio.
Per l'allocazione, devi prevedere il numero massimo di caratteri. Ad esempio, se gli interi sono dei valori a 32 bit con segno, questi potranno essere lunghi al massimo 10 caratteri (segno piu' 9 cifre) e quindi, considerando gli spazi e il terminatore, dovrai allocare *almeno* 33 caratteri.
Quindi, userai la malloc ...
No MP tecnici (non rispondo nemmeno!), usa il forum.
Mi sa che ne sono necessari 10 anche se non si considera il segno, o sbaglio ?
2^32 = 4.294.967.296
9^10 = 3.486.784.401
Puoi anche scrivere una piccola funzione che conti le cifre di ciascun numero prima di fare l'allocazione della memoria. Ti basta eseguire queste righe
per tutti e tre i numeri e alla fine cnt conterrà il numero di cifre totali. A quel punto ti basta magari incrementarlo di 3 (per due spazi e il terminatore) e procedi con l'allocazione dinamica della memoria senza sprecare spazio. Certo in questo modo esegui calcoli in più, quindi non è detto che sia la soluzione migliore... è solo per la cronacacodice:/* per il segno (se c'è) e per il caso in cui il numero sia proprio 0 */ if ( num < 0 || num == 0 ) cnt++; while ( num ) { num /= 10; cnt++; }![]()
every day above ground is a good one
E' piu' pratico l'uso di un logaritmo ...Originariamente inviato da YuYevon
Puoi anche scrivere una piccola funzione ...
No MP tecnici (non rispondo nemmeno!), usa il forum.
Sì ... sono 11 per ogni intero + 3 per separatori e terminatore ... almeno 36 ...Originariamente inviato da Ed_Bunker
Mi sa che ne sono necessari 10 anche se non si considera il segno, o sbaglio ?
2^32 = 4.294.967.296
9^10 = 3.486.784.401
No MP tecnici (non rispondo nemmeno!), usa il forum.
Considerando unsigned int dovrebbero essere necessarie (E sufficienti) proprio 10 cifre per ciascun intero.Originariamente inviato da oregon
Sì ... sono 11 per ogni intero + 3 per separatori e terminatore ... almeno 36 ...
Non credo, inoltre, che vi sia la necessita' di inserire uno spazio tra i diversi unsigned int che formeranno la stringa.
Il carattere finale '\0' viene inserito dalla sprintf "automaticamente" oppure deve essere inserito esplicitamente ?
Se sono "unsigned" ovviamente non consideri il segno (ma tu avevi parlato di 3 interi senza dire nulla sui segni) ... il terminatore lo scrive la sprintf ma lo spazio lo devi prevedere tu.
No MP tecnici (non rispondo nemmeno!), usa il forum.
Si, certo, questo si.Originariamente inviato da oregon ... il terminatore lo scrive la sprintf ma lo spazio lo devi prevedere tu.
Quello che mi chiedevo e'... se non allocando lo spazio per il carettere finale aggiuntivo si provoca (possibilmente) un seg fault in seguito alla chiamata alla sprintf o se, invece, in tal caso la sprintf sovrascrive il carattere finale oppure proprio non mette lo '\0' con conseguenze problematiche quando si andra' a fare la free...