Conversione int-char con itoa e tanti zeri...

Ciao a tutti, ho dei dubbi sull'uso di itoa. Ho capito che itoa converte da int a char array, e la sua sintassi è char a[5]; int b; itoa(b,a,10);

funziona perfettamente, ma il mio crucio (se così vogliamo chiamarlo) è: come fare a convertire un numero mantenendo lo stesso numero di cifre? Mi spiego, se devo convertire 1, nel baffer dopo itoa troverò 1 ( in char), come posso fare per far trovare 0001????? Spero di essermi spiegato.... Grazie per il vostro aiuto

Non so se funziona (non credo) ma hai provato a riempire l'array di '0' e poi chiamare la itoa? In caso alternativo un metodo non canonico, ma certente funzionante é pensare a come scriversi una funzione che faccia quanto voluto. Con un po di conoscienza di cicli for credo sia facile. Per i metodi canonici Guglielmo é quelli giusto

Puoi "spostare" la stampa a destra con qualcosa di questo tipo:

#define N 5
char a[N];
int b;
itoa(b,a,10);

byte l = strlen (a);
memmove (a + (N - l), a, l);
memset (a, '0', N - l);

Non ho idea se funzioni :D.

Primo errore, lunghezza dell'array. Su Arduino int ospita valori tra -32768 a 32767 quindi la conversione può arrivare a sei caratteri più il carattere terminatore, un array dimensionato a 5 caratteri può portare a errori per via del overflow dell'array durante la conversione quindi va definito almeno di lunghezza 7. Poi per fare la zerofill puoi pensare di usare la funzione sprintf anziché la itoa che ti permette di fare quel che desideri.

@Silente Se riempi un vettori di char con il carattere '0' e poi lo passi alla itoa o ad una qualsiasi funzione di manipolazione stringhe (che non sia la concatenazione) i valori vengono sovrascritti. Quello che si può fare se si vuol intraprendere quella strada è quella di determinare la lunghezza della stringa risultante dalla itoa usando un secondo array di char, inserire nel primo array tanti zeri quanti servono (lunghezza desiderata-lunghezza della seconda stringa) e poi concatenare le due.

grazie dei suggerimenti. Fabpolli effettivamente il discorso è giusto, avevo messo 5 perchè per certo i numeri che manipolavo erano positivi e massimo arrivano a 9000 (posso urase itoa anche per una unsigned int???). Sprintf se non sbaglio è sempre stata sconsigliata perchè impiega tempo e risorse...confermi? Sukkopera, non ho modo di testare quello da te scritto...appena riesco la provo e vi dico.... Fabpolli seguendo l'idea di @Silente, devo usare Pstring?? Come faccio afare in pratica quello che dici??? (non ho dimestichezza con le stringhe...) Grazie

(Io l'ho provato e sembra funzionare)

Scusa Sukkoper, memset e memmove sono dentro la libreria string.h da includere?? Non conosco questa libreria e i suoi metodi, puoi darmi il link dove poter leggere? Altra domanda: non si lavora con le string del c, vero?? Scusa questa domanda, ma leggo sempre che le string sono sempre sconsigliate...

>manolomao: ... sono tutte cose che trovi nella AVR libc, libreria che di base viene SEMPRE inclusa dall'IDE. Studiatela bene perché offre un'infinità di funzioni estremamente ottimizzate !

Guglielmo

grazie Guglielmo, ci guardo subito... Quindi se non ho capito male Sukkopera, prima trasformo il mio int in char, poi con memmove sposto il dato convertito di a+(N-l) posizioni per far spazio agli 0 che vado ad inserire con memset..... E' giusto come ragionamento???

Sì, funziona così. Sono 2 funzioni, dai nomi abbastanza espliciti…

Per il resto, la prima parte è uguale alla tua, per cui continua ad usare le stringhe C-style.

Ho qualche dubbio sul terminatore di stringa, credo sarebbe bene forzarne la presenza:

a[N - 1] = '\0';

manolomao: Scusa questa domanda, ma leggo sempre che le string sono sempre sconsigliate...

Solo una precisazione quello che si sconsiglia è la classe String [u]non[/u] le stringhe classiche del c (vettore di char) che trovi riportate nell'ottimo esempio di SukkoPera e anche negli altri di questo topic

fabpolli:
… quello che si sconsiglia è la classe String

… perche’ ? … mordono ? … :smiley:

No, seriamente, per quale motivo sono sconsigliate ?

Classe String su MCU ti questa classe crea un sacco di problemi legati alla memoria. Su Arduino & co. non esiste il garbage collector come si PC e simili che si occupa di "analizzare" la memoria e liberarla da tutto quello che non è più in uso, qui invece la classe String alloca dinamicamente memoria per ospitare le varie stringe e sua manipolazioni (concatenazione, sostituzioni, ecc.) e purtroppo non la rilascia, quindi alla lunga il programma allocherà sempre più memoria fino ad arrivare alla sua saturazione (memory overflow). Il vero problema è che questo capita a casaccio ed è difficile capire che il programma si blocca o da risultati inattesi per via delle memoria piena e il debug è un delirio, da qui il consiglio di non usare la "comoda" classe string ma usare sempre le stringhe classiche del C. Ovvio che se uso la classe String per allocare una stringa fissa che non muta mai e che viene stampata su monitor seriale o display il problema non si pone (non viene mai deallocata e riallocata se globale ad esempio) ma alla fine è bene consigliare sempre di non usarla, una volta capito quelle tre o quattro istruzioni base per usare i char array (magari ci si fa delle librerie di manipolazione o similare) della classe non se ne sente la mancanza (io mai sentita perché ho sempre usato da subito i char array per mia fortura e perché li avevo studiati a scuola e la classe String manco esisteva :) )

Quindi ci ho azzeccato, mordono (nel senso che "si mangiano" la memoria :D) ... buono a sapersi ;)

Etemenanki:
Quindi ci ho azzeccato, mordono (nel senso che “si mangiano” la memoria :D) … buono a sapersi :wink:

Etem … ne avremo parlato, da anni, un migliaio di volte e tu …
… non sei mai capitato su una di queste discussioni ? ? ? :o :o :o

Se cerchi, questa l’avrò scritta non so più nemmeno io quante volte …

NON sei su un PC dove c’è un sistema operativo ed un “garbage collector”, sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe “String”, a causa dell’allocazione e riallocazione dinamica della memoria, porta quasi sempre … a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Impara ad usare le stringhe classiche del C … ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (… che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>

Guglielmo

No, non le avevo lette, mi spiace ... o almeno, non mi ricordo proprio di averle mai lette ...

Etemenanki: No, non le avevo lette, mi spiace ...

... incredibile, contro ogni teoria delle probabilità ! :D :grin: :D :grin:

Guglielmo