itoa selber basteln?



  • Grundsätzlich würde ich nicht versuchen, itoa entsprechend diverser Implementierungen nachzubauen. Dann kannst du auch gleich direkt itoa nehmen.
    Zudem solltest du alles, was keine Laufzeitdynamik braucht, mittels Templates realisieren, wie zB radix oder uppercase/lowercase.
    Hier mal ein Ansatz meiner Funktionen, mit denen ich vor einiger Zeit rumgespielt habe

    // x - zu konvertierender Wert
    // destination - Zielstring
    // length - verfuegbare Laenge des Zielstrings
    // return - Beginn des konvertierten Wertes im Zielstring
    template <unsigned int Radix, bool UpperCase>
    char* integer_to_string(unsigned int x, char* destination, size_t length)
    {
    	// static assert 2 <= radix <= 36
    	// assert length != 0
    	static const char* digit_map[2] = {"0123456789abcdefghijklmnopqrstuvwxyz", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    	const char* digits = digit_map[UpperCase];
    	char* p = &destination[length];
    	do
    	{
    		unsigned int digit = x % Radix;
    		x /= Radix;
    		--p;
    		*p = digits[digit];
    	}
    	while (x != 0 && p != destination);
    	return p;
    }
    

    Falls man nun eine Funktion braucht, die speziell dezimale Zahlen ausgeben soll, kann man eine entsprechende Verkürzung schreiben

    char* integer_to_string_10(unsigned int x, char* destination, size_t length)
    {
    	return integer_to_string<10, false>(x, destination, length);
    }
    

    Für signed Zahlen müsste man natürlich noch entsprechende Anpassungen vornehmen.
    Zudem ist zu beachten, dass hier kein C-String erzeugt wird, sondern die reine Zeichensequenz. Aber ein '\0' Zeichen am Ende ranzuhängen, sofern dies erforderlich ist, sollte kein allzu grosses Problem sein.


Anmelden zum Antworten