Mi pare che tu ti stia complicando inutilmente la vita, per diversi motivi:
- per ottenere il resto della divisione intera non c'è bisogno di fare tutto quel bailamme con i float, basta usare l'operatore modulo; è da qui che vengono i tuoi errori di precisione che dici, dato che i float hanno precisione limitata e per questo spesso si ottiene un risultato non esatto sulle divisioni per 10 (le uniche divisioni che danno risultati esatti con i float e i double sono quelle per potenze di due);
- per ottenere la lunghezza della stringa basta s.size(); (e se nella tua lun_str conti i caratteri finché non trovi uno 0 - come nelle stringhe C - stai facendo un errore);
- non c'è bisogno di riportare i codici ASCII come numeri (cosa che peraltro rende il tuo programma potenzialmente non portabile, ma soprattutto poco leggibile), puoi specificare literal di tipo char semplicemente mettendo il carattere che ti interessa tra apici singoli - quindi, non scrivere 48 ma '0';
- per invertire la stringa, basta usare l'algoritmo reverse dall'header <algorithm>.
Ergo, il tuo codice (con in aggiunta il supporto ai numeri negativi) diventa:
codice:
#include <algorithm>
#include <string>
std::string inttostr(int n)
{
// Caso speciale: n=0
if(n==0)
return "0";
// Stringa da restituire
std::string ret;
// Se il valore è negativo, se lo segna e per il resto dell'algoritmo considera il valore assoluto
bool minus=n<0;
if(minus)
n=-n;
// Ad ogni iterazione attacca in fondo alla stringa il resto della divisione intera per 10, e divide per
// 10 n
for(;n;n/=10)
ret+=(n%10)+'0';
// Se il numero era negativo, attacca in fondo il meno
if(minus)
ret+='-';
// Inverte la stringa
std::reverse(ret.begin(), ret.end());
return ret;
}
Ma tutto sommato la maniera più semplice per scrivere del codice del genere sarebbe usare semplicemente le funzionalità che il C++ già mette a disposizione:
codice:
#include <sstream>
#include <string>
std::string inttostr(int n)
{
std::ostream os;
os<<n;
return os.str();
}
P.S.: il codice va specificato tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione; qui ho corretto io, in futuro ricordatene.