[C] Integer in String umwandeln

OP #3118370
Lesenswert?
• ▲
▼
Hallo zusammen

Im Zusammenhang eines Projekts ist eine C-Bibliothek entstanden, welche 
Integer in Strings umwandelt. Unterstützt werden dabei die Datentypen 
aus stdint.h: (u)int8/16/24/32/64_t. Für jeden Datentyp existiert eine 
eigene Funktion, diese Funktionen enthalten jedoch alle den selben Code. 
Um eine Copy&Paste-Orgie zu vermeiden, wurde eine Makro-Orgie gestartet, 
was die Übersichtlichkeit nicht wirklich verbesserte, dafür müssen 
Änderungen am Code nur an einer Stelle vorgenommen werden.

Eine Dokumentation existiert zur Zeit nicht, daher hier eine kurze 
Anleitung:
1
char *(u)int??str(char *target, (u)int??_t source)
Diese Funktionen wandeln einen Integer in einen String um. Dafür sollte 
möglichst immer der kleinstmögliche Datentyp gewählt werden. Wenn ein 
uint8_t umgewandelt werden soll, sollte auch uint8str(...) verwendet 
werden, denn z.B. mit uint32str(...) kann die Umwandlung der gleichen 
Variablen ca. 5 mal länger dauern.
1
char *(u)fixint??str(char *target, (u)int??_t source, int_fast8_t cp)
Diese Funktionen wandeln Fixkommazahlen in Strings um. Der Wert von cp 
bestimmt den Ort des Kommas. Ist cp z.B. 3, so wird aus 1234 1.234. Ist 
cp -3, so wird aus 1234 1234000. Diese Funktionen sind eher 
Speicherintensiv was den Programmspeicher anbelangt, daher sollten nicht 
benötigte Funktionen auskommentiert werden, wenn kein Compiler verwendet 
wird, der nicht benötigten Code nicht compiliert.
1
char *strRalign(char *str, uint_fast8_t minlenght)
Diese Funktion richtet die erzeigten Strings nach rechts aus. minlenght 
gibt dabei die Länge des zu erzeugenden Strings an. Ist der String 
länger als minlenght, so wird der String nicht verändert.

Da alle Funktionen den Pointer zum String zurückgeben, kann ein nach 
rechts ausgerichteter String in einer Zeile erzeugt werden:
1
strRalign(uint16str(str,value),6);


Diese Funktionen sind mit meinem System (PIC18F452 + XC8-Compiler) 
schneller, als itoa und utoa aus der Standardbibliothek, besonders wenn 
8Bit Variablen umgewandelt werden müssen. Dafür kann bei meinen 
Funktionen die Basis nicht gewählt werden, es ist also nur eine dezimale 
Darstellung möglich.

Konstruktive Kritik, Verbesserungsvorschläge und Vorschläge für 
Erweiterungen sind jederzeit willkommen. Falls jemand einen Fehler 
findet, bitte ich ihn, dies mir mitzuteilen.
Angehängte Dateien:
OP #3119552
Lesenswert?
• ▲
▼
Ich habe noch eine kleine Anwenderdokumentation geschrieben, die dabei 
helfen soll, die Bibliothek zu benutzen. Eine ausführliche Dokumentation 
des Sourcecodes ist nicht geplant.

Natürlich habe ich schon einen kleinen Fehler gefunden. Bei der 
Ermittlung der Stringlänge in strRaglign wird auf 0 (Null) statt '\0' 
geprüft. In den meisten Fällen sollte dies keine Probleme machen, 
ansonsten händisch korrigieren. Näheres dazu in der Anwenderdoku.
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.