creare versione custom di dtostrf

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

?? 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.

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"

prova un pò a guardare sprintf()

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.

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.

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.

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)?

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

Non mi pare possa stampare in binario.

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:

    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)));