convertire un intero in una stringa ...

http://www.cplusplus.com/reference/cstdlib/itoa/

http://www.cplusplus.com/reference/cstdio/sprintf/

Per quanto riguarda String, non lo uso mai... ma se ha un metodo di conversione int-stringa sicuramente si trova nella reference di questo stesso sito.

No, sprintf usa la stessa sintassi di printf con la differenza che scrive su un array di caratteri invece che sulla console standard, tipicamente l'UART su i micro.
Usa itoa() che oltre a richiedere molta meno flash di sprintf è anche molto più veloce, parliamo di 25-40 us contro anche oltre 1 ms per la sprintf.

Grazie... ho fatto così e funzione:

definito
int intPIN = 123; // il pin in formato numerico int
char bufferPIN[6];
String keyPIN;

e nella funzione
keyPIN = itoa(intPIN, bufferPIN, 10));

e funziona bene.... senza dover modificare nulla del codice già esistente e funzionante...
ho capito che ha bisogno del buffer, anche se solo in modo temporaneo.... ma và bene così...

adesso ho questo problema, vorrei aggiungere degli zero quando la lunghezza della stringa è inferiore a 5 elementi...
cioè
il PIN potrà essere
65535 e convertito in stringa sara "65535".. ovvero se il PIN (impostato nella EEpROM) fosse, per esempio, 123... la conversione dovrà rendere "00123" .. quindi sempre composto da almeno 5 char...

pensavo di leggere la lunghezza della stringa e poi non mi è ben chiario come "concatenare", uno, due o tre zeri davanti....

come mi suggerite di fare per aggiungere qualche zero all'inizio della stringa???

grazie

Ma scrivere String A=(String)numeroInt; non va?

Posto che il tempo di esecuzione non sia un problema, potresti usare:

sprintf(buf, "%05d", numero);

pablos:
Ma scrivere String A=(String)numeroInt; non va?

Non saprei Pablos... non l'ho provato.. stasera provo, anche se, a questo punto, non è più importante visto che la ìconversoine la faccio!!! ... non ho problemi di tempo.. in quanto è una funzoine che viene richiamata una volta ogni qualche settimana .....

tuxduino:
Posto che il tempo di esecuzione non sia un problema, potresti usare:

sprintf(buf, "%05d", numero);

... anche per questo.. stasera provo... ma anche se non funzoinasse nessun problema ... ma cosè quel %05d????

grazie comunque.... ma non mi avete suggerito come anteporre alcuni zeri alla stringa originata ...

gli zeri dovrebbero essere in numero pari a 6 - keyPIN.length()

ma cosè quel %05d????

Ma solo a me viene in mente di cercare su google ?

tuxduino:

ma cosè quel %05d????

Ma solo a me viene in mente di cercare su google ?

:sweat_smile:

... cavolo mi sa che fà già la formattazoine come la voglio io!!!! ..

interessantissimo... posso formattare anche diversi dati in un unico output....

prima non gli ho dato molto peso a questa ipotesi di soluzoine perchè non l'avevo capita.. mi sembrava più semplice itoa .....

grazie .. e scusa!!!!

:slight_smile:

tux.....

non sono riuscito a farlo funzionare.. mi sà che esige un vettore di char ....

invece fuzniona bene String(intero);
non sono riuescito invece a fare questo
String keyPIN;
keyPIN = "0" + String(intero); e non capisco perchè non dovrebbe concatenare le due stringhe??

neanche questo funzione
keyPIN.concat ("0", keyPIN); .. divrebbe unire al primo 0 la stringa keyPIN e rimettere tutto in keyPIN ... ma non funge...
suggerimenti????

Posta il codice che "non funziona".

Comunque se intuisco correttamente stai provando a passare alla sprintf() un oggetto String come argomento.. Errore: come hai ipotizzato, devi usare un vettore di char.

Tipo:

char buf[20];
sprintf(buf, "%05d", numero);
Serial.println(buf);    // opzionale - solo per debug

intA = 123;
intB = 456;

Es:
Serial.println((String)intA+(String)intB);
uscita "123456"

Es:
Serial.println("mia stringa " + (String)intA);
uscita "mia stringa 123"

Es:
Serial.println((String)intB);
uscita "456"

opp se vuoi caricare l'intero in una stringa e usarla come variabile
Es:
String interoA = (String)intA;
String interoB = (String)intB;

Serial.println(interoA + interoB);
Serial.println(interoA + " " + interoB);

dov'è il problema? forse non ho capito io...

Appunto, dov'è il problema ? Le ultime 4 righe di codice che hai postato compilano.

Finché ti limiti a qualche riga di codice decontestualizzata è difficile essere di aiuto... Quando si dice "posta il codice che ti dà problemi", si intende tutto lo sketch, con indicazione del punto "critico".

vi chiedo scusa .. ma qui non ho com me l'ide ne il micro per fare le prove..

io converto l'intero in una stringa correttamente facendo così:
String keyPIN;
int intPIN = 123;

keyPIN = String(intPIN);

e fin qui va tutto bene..
adesso devo anteporre alla stringa keyPIN che ha assunto il valore "123" uno zero, un char '0', mettere quindi nella stessa stringa keyPIN prima '0', poi "123" .. per ottenere questo "0123" ....

non sono riuscito a concatenare due stringhe mettendole nella stessa variabile di prima cioè vorrei fare:
keyPIN = '0' + keyPIN;
oppure
keyPIN = '0' + String(intPIN);
ma nessuna di queste due forme compila....
per adesso non devo stampare nulla devo semplicemente anteporre degli zeri davanti ad una stringa, non un vettore di char, quando questa e composta da meno di 6 caratteri numerici.... non so me'rendo!!!

stasera dopo cena potro riprovare .. scusate se vi sto annoiando... sono fuso .....porka miseria ....
ciao

No prob :slight_smile:

Ma non capisco cosa c'è che non va nella sprintf ? :slight_smile:

non sono riuscito a concatenare due stringhe mettendole nella stessa variabile di prima cioè vorrei fare:
keyPIN = '0' + keyPIN;
oppure
keyPIN = '0' + String(intPIN);
ma nessuna di queste due forme compila....

Non ho capito, c'e' gia una libreria interna che usa quello che state dicendo sprintf, buffer ecc, perchè glieli fare rifare quando (String) raccoglie già le istruzioni sopracitate?

ti ho fatto gli esempi prima

Es:
Serial.println("mia stringa " + (String)intA);
uscita "mia stringa 123"

invece di mia stringa ci metti 0
keyPIN = "0" + String(intPIN);
Se intPIN lo hai già convertito in String non è più necessario usare (String)
lo scriverai direttamente
keyPIN = "0" + intPIN; // >>>risultato 0123

Le stringhe si trattano tra " " (virgolette) i char tra ' ' (apici)

ciao

String è fortemente sconsigliata per problemi di frammentazione della RAM (se ricordo bene), quindi un po' per questo un po' per abitudine non la uso quasi mai su Arduino. Ma certamente è più intuitivo e "facile" concatenare le stringhe con l'operatore + di String che alambiccarsi con buffer, s(n)printf e compagnia... :stuck_out_tongue:

Ciao Pablos

non sò perchè ma questo:

pablos:
Es:
Serial.println("mia stringa " + (String)intA);
uscita "mia stringa 123"
invece di mia stringa ci metti 0
keyPIN = "0" + String(intPIN);

non funziona.... cioè compila, ma poi mi blocca il micro....

se faccio questo
keyPIN = "0" + String(intPIN) + "/0";
di nuovo, compila, apparentemente il micro funziona, perchè tutto il resto funziona... ma non mi funziona il riconoscimento del pin....

comunque ho risolto così:

  unsigned int  intPIN = ((EEPROM.read(6)) | (EEPROM.read(7)<<8));         // legge il  PIN compreso tra 00000 e 65535 dalla eeprom;
           char bufferPIN[6];
           String passPIN;    // PIN in formato stringa
           for (int i=String(intPIN).length(); i<5 ; i++){ passPIN += "0";} // aggiunge eventuali zero
           passPIN += (String)intPIN; // acquisisce il PIN 
           // Serial.print (passPIN);

           // cerca la password nei primi passKey.length() caratteri
           passBool = (char_DTMF_buffer.substring(0, passPIN.length()) == passPIN);

questo di sopra è l'utilizzo completo di ciò di cui avevo bisogno, in particolare:

prima aggiungo gli zeri che mi servono con questa istruzione:
passPIN += "0";

poi aggiungo il PIN vero e proprio, convertendolo da intero a stringa:
passPIN += (String)intPIN;

adesso non ricordo se ho propvato anche questo:
passPIN += String(intPIN);

comunque funziona benissimo
poi faccaio il riconoscimento del codicePIN nel comando ricevuto con l'istruzoine successiva...

grazie
ciao

Se i due pin, quello inserito dall'utente e quello memorizzato, sono entrambi numeri senza segno, non faresti prima a confrontarli direttamente come tali ?

unsigned int enteredPin = atoi(char_DTMF_buffer);
unsigned int  storedPin = ((EEPROM.read(6)) | (EEPROM.read(7)<<8));
passBool = enteredPin == storedPin

ma soprattutto che significa

intPIN = ((EEPROM.read(6)) | (EEPROM.read(7)<<8));  //legge il  PIN compreso tra 00000 e 65535 dalla eeprom;

in ogni cella della eeprom ci scrivi un byte, il numero del pin non supera certo il 255, perchè usi l'intero?