# creare versione custom di dtostrf

**URL:** <https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883>\
**Category:** Software\
**Created:** [February 7, 2016, 2:57pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883 "2016-02-07T14:57:30Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![brazoayeye](https://avatars.discourse-cdn.com/v4/letter/b/ec9cab/32.png) [@brazoayeye](https://forum.arduino.cc/u/brazoayeye)\
**Post date:** [February 7, 2016, 2:57pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/1 "2016-02-07T14:57:30Z")

</div>

salve, vorrei creare una versione particolare di dtostrf in quanto io ho dei char[37] all'interno dei quali vorrei inserire i cinque caratteri dei numeri convertiti. Usando dtostrf è semplice iniziare l'inserimento in un punto di char (direttamente aumentando il puntatore) ma non sono ancora riuscito ad evitare che dtostrf inserista \0 alla fine del numero (che causa la fine prematura della mia stringa).

L'unica soluzione che sono riuscito a trovare è creare una funzione custom che memorizzi il carattere di char[37] dove andrà a finire \0 e lo sovrascrive una volta che dtostrf è stato eseguito. (do per scontato che la lunghezza del numero sia sempre uguale al paramtro LunghezzaMinima in input a dtostrf).

Mi stavo chiedendo se è possibile editare "alla sorgente" la libreria (ovviamente è una soluzione solo per il mio pc) o se c'è qualche altro sistema che potrei usare.

Grazie

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [February 7, 2016, 4:06pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/2 "2016-02-07T16:06:23Z")

</div>

?? la funzione non la puoi modificare. E mi pare inutile.  
1- un qualsiasi char '\0' ci puoi passare sopra (è un carattere normalissimo)  
2- se vuoi scrivere proseguendo da dove ha finito la funzione in oggetto, quindi "passando" sopra al '\0' che ha inserito, basta che alla prossima dtostrf() passi l'indirizzo del vettore + un numero di caratteri e punti sul '\0' appena inserito. Oppure sopra a '\0' ci metti spazio.

```cpp
char buf[20]; 
float n=23.789, m=32.22;
dtostrf(n, 2, 2, buf);    // buf=23.79 + '\0'
buf[5]=' ';                //      0123456789
dtostrf(m, 2, 2, buf+6);   // buf="23.79 32.22"

```

---

<div class="post-metadata">

**Author:** ![vbextreme](https://avatars.discourse-cdn.com/v4/letter/v/71c47a/32.png) [@vbextreme](https://forum.arduino.cc/u/vbextreme)\
**Post date:** [February 7, 2016, 4:17pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/3 "2016-02-07T16:17:25Z")

</div>

prova un pò a guardare sprintf()

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [February 7, 2016, 4:33pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/4 "2016-02-07T16:33:35Z")

</div>

sprintf() (ed io preferisco la snprintf) su compilatore per avr non gestisce il %f quindi i float, hanno "spento" quella parte perchè era un codice molto pesante e che occupava molto codice.

---

<div class="post-metadata">

**Author:** ![brazoayeye](https://avatars.discourse-cdn.com/v4/letter/b/ec9cab/32.png) [@brazoayeye](https://forum.arduino.cc/u/brazoayeye)\
**Post date:** [February 9, 2016, 9:31pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/5 "2016-02-09T21:31:42Z")

</div>

l'utilità di fare questa funzione è che dovrei inserire il float all'interno di un testo già fatto ad esempio la stringa iniziale sarebbe

valore attuale: xxx.xx  
valore impostato: yyy.yy

e io voglio inserire il float dentro xxx.xx e yyy.yy senza dover fare molte righe di codice che renderebbero difficilmente leggibile il risultato finale.

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [February 10, 2016, 8:12am UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/6 "2016-02-10T08:12:27Z")

</div>

E allora come dice @vbextreme usi la snprintf() ma con il limite che non accetta i float, quindi devi spezzare il float in due parti, quella intera (semplice) e quella decimale.  
Poi, mi ripeto, le funzioni sulle stringhe (array di char) accettano anche il nome del vettore + un valore che ti sposta all'interno dell'array stesso.

---

<div class="post-metadata">

**Author:** ![brazoayeye](https://avatars.discourse-cdn.com/v4/letter/b/ec9cab/32.png) [@brazoayeye](https://forum.arduino.cc/u/brazoayeye)\
**Post date:** [February 16, 2016, 2:01pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/7 "2016-02-16T14:01:07Z")

</div>

Ok, ho usato con successo sprintf\_P (mi risulta più comoda).

Ho ancora un dubbio: come posso esprimere una variabile in base 2 su sprintf (voglio visualizzare un int come un insieme di 1 e 0)?

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [February 16, 2016, 8:22pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/8 "2016-02-16T20:22:41Z")

</div>

[http://www.cplusplus.com/reference/cstdio/sprintf/](http://www.cplusplus.com/reference/cstdio/sprintf/)  
[http://www.cplusplus.com/reference/cstdio/printf/](http://www.cplusplus.com/reference/cstdio/printf/)

Non mi pare possa stampare in binario.

---

<div class="post-metadata">

**Author:** ![vbextreme](https://avatars.discourse-cdn.com/v4/letter/v/71c47a/32.png) [@vbextreme](https://forum.arduino.cc/u/vbextreme)\
**Post date:** [February 16, 2016, 9:23pm UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/9 "2016-02-16T21:23:01Z")

</div>

```cpp
char* dtostrb(char* d, size_t sz, unsigned int s)
{
    char *st = d;
    size_t szi = sizeof(int) * 8;
    
    while( --sz && szi-- )
        *d++ = (( s >> szi ) & 1) + '0';
    
    *d = '\0';
    return st;
}

```

e la usi:

```cpp
    char bit[sizeof(int) * 8 + 1];
    char str[50];
    int val = 0x8001;
    sprintf(str,"val:%d bit:%s\n", val, dtostrb(bit, sizeof bit, (unsigned int)(val)));

```

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 7, 2021, 2:02am UTC](https://forum.arduino.cc/t/creare-versione-custom-di-dtostrf/363883/10 "2021-05-07T02:02:43Z")

</div>


