Hallo Leute, gibt es eine einfache und schnelle Möglichkeit in C (gcc-avr), Nullen mit dynamischer Anzahl einzufügen? [X] = variabler int Wert sprintf(MyCharArray, "%0[X]i", MyInt);
evtl. char fmt[32]; snprintf(fmt, sizeof(fmt) "%%0%ui", X); snprintf(MyCharArray, sizeof(MyCharArray), MyInt);
evtl so (korrigiert). char fmt[32]; snprintf(fmt, sizeof(fmt) "%%0%ui", X); snprintf(MyCharArray, sizeof(MyCharArray), fmt, MyInt);
Ein richtiges printf kennt "*". Und dann sieht das ganze so aus:
1 | sprintf(MyCharArray, "%0*i", breite, MyInt); |
So geht das natürlich nicht... Die Zahl, die du dort in den Formatstring einfügen willst, ist auch nicht die Anzahl von Nullen, sonden die Angabe für die Mindestlänge der Ausgabe des Wertes. Schau mal in die Dokumentation zu printf Format-Strings. Was geht: Entweder den Variablen Parameter im Formatstring verwenden: * uint8_t x = 3; sprintf(MyCharArray, "%0*i", x, MyInt); Oder den Formatstring mit der gewünschten Zahl an der Stelle vor dem sprintf()-Aufruf in einer Stringvariable zusammenzubauen und dann im Aufruf statt eines string-literals die Adresse der Stringvariablen angeben. char FmtStr[] = "%03i"; // hier ggf. FmtStr geeignet modifizieren // z.B. FmtStr[2] = '5'; sprintf(MyCharArray, FmtStr, MyInt);
Thosch38 schrieb: > Was geht: > Entweder den Variablen Parameter im Formatstring verwenden: * Oliver S. schrieb: > ... oder die Doku zur avrlibc... Zitat > The variable width or precision field (an asterisk * symbol) is not realized and > will to abort the output. Oliver
:
Bearbeitet durch User
@Thosch38 (Gast)
>So geht das natürlich nicht...
Wieso sollte das nicht gehen (wenn "%0*i" nicht verfügbar)?
1 | char fmt[32]; |
2 | |
3 | snprintf(fmt, sizeof(fmt), "%%0%ui", X); |
4 | snprintf(MyCharArray, sizeof(MyCharArray), fmt, MyInt); |
Rufus Τ. F. schrieb: > Ein richtiges printf kennt "*". Mag ja sein - aber das Ganze auch auf einem gcc-avr? Ihr denkt mal wieder viel zu eng-horizontig, so daß euch nichts anderes einfällt, außer in allen möglichen Versionen von printf herumzusuchen, ob sich da nicht endlich irgendwas passendes finden läßt. Warum seid ihr alle bloß so un-kreativ? Und warum schafft ihr es partout nicht, mal eine seit Jahren hier verfügbare Lösung des Problems herzunehmen? Ich häng sie euch mal dran, sie stammt aus der Lernbetty. W.S.
W.S. schrieb: > Warum seid ihr alle bloß so un-kreativ? Kannst du mal erklären, was das Nachprogrammieren der Formatierung der printf aus der Standard-Bibliothek mit Kreativität zu tun hat - kommt die bei der Fehlersuche?
Schuster schrieb: > sprintf(MyCharArray, "%0[X]i", MyInt);
1 | char format[6]; |
2 | sprintf( format, "%%0%di", X ); |
3 | sprintf(MyCharArray, format, MyInt); |
:
Bearbeitet durch User
Genau, warum auch in der standardisierten, wohldokumentierten, nahezu überall verfügbaren Standard C-Bibliothek nachschauen, wenn man auch die tolle W.S.-Bibliothek nutzen kann, die 1. unvollständig ist - wo ist die StdTypes.h? 2. Direkt in der 1. Codezeile einen Fehler hat: #ifndef _CONV_INCLUDED das ist ein verbotener Bezeichner für User-Code 3. Äußerst knapp dokumentiert ist 4. Komischen Code-Stil hat (z.B. "extern" an Funktionsprototypen, tolle Variablennamen P, Q, L, v, i, j, k alle am Funktionsanfang?!, goto, ...) 5. Dann aber doch selber die Standard-Bibliothek voraussetzt (math.h, stdlib.h) 6. Annahmen über die Größe von long usw. trifft, also vermutlich überhaupt nicht portabel ist 7. Eigene Integer-Typen wie dword braucht (warum nicht einfach uint32_t)
8. Keine Lizenzangabe hat und daher nicht in eigenen Projekten nutzbar ist ohne dass man fürchten müsste, von W.S. aufgrund von Urheberrechtsverletzung verklagt zu werden
Dr. Sommer schrieb: > 7. Eigene Integer-Typen wie dword braucht (warum nicht einfach uint32_t) Du weisst doch: W.S. lehnt uintX_t grundweg ab. Konnte man schon mehrfach hier lesen ;-) Und schön ist auch irgendwie anders.
Frank M. schrieb: > Und schön ist auch irgendwie anders. Na dann zeig mal. Also, hier großmäulig herumzukritisieren ohne selber was vorzulegen, ist einfach nur heiße Luft. So, währen ihr euch alle zum 39 mal darum streitet, welche Zeichen im Formatstring denn nun zum gewünschten Ergebnis führen könnten, funktioniert die Konvertierung aus der Lernbetty auf Anhieb und problemlos - und die eine darin befindliche Funktion, die benötigt wird, braucht auch nicht annähernd soviel Platz wie ein voll aufgeblasener printf-Interpreter. Anstatt hier zu lamentieren, solltet ihr lieber mal Nägel mit Köpfen machen. Das wäre was Nützlicheres. Also, Frank, zeig mal, wie du es schöner hinkriegst. W.S.
W.S. schrieb: > Anstatt hier zu lamentieren, solltet ihr lieber mal Nägel mit Köpfen > machen. Das wäre was Nützlicheres. Zeig doch erstmal, welche deiner Funktionen das Gewünschte macht, also eine variable Anzahl an Nullen ausgibt, damit wir eine Referenz haben. Aus deinen Kommentaren ist jedenfalls nicht wirklich ersichtlich, wie das gehen soll.
W.S. schrieb: > Also, Frank, zeig mal, wie du es schöner hinkriegst. Per itoa() den String erzeugen, die Stringlänge ermitteln und dann die entsprechende Anzahl von Nullen (Differenz zu den gewünschten Digits) davorknallen. Kommt ohne printf() aus und ist ebenso ziemlich schlank - am geringen Aufwand gemessen. Funktioniert sogar nicht nur mit Basis 10 :-) Ist ein Vierzeiler, den muss ich jetzt aber nicht hier hinschreiben, oder? Tut mir leid, ich finde Deinen Source wirklich nicht sehr ästhetisch und auch nicht gut lesbar. Dazu tragen die einstelligen Variablennamen bei, die mal groß, mal klein geschrieben werden, die gemischte Verwendung von Groß- und Kleinbuchstaben innerhalb von Bezeichnern wie z.B. LONGtoStr (warum ONG aber tr?), die inkonsequente Verwendung von Einrückungen innerhalb geschweiftger Klammern (Klammer steht mal unter dem i vom if, aber auch mal viel weiter rechts), das Schreiben von Code rechts von '{', statt diesen Platz für Kommentare zu nutzen, das Weglassen von Leerzeichen links und rechts von Operatoren. Der Code sieht da ziemlich gequetscht aus. Nach dem Motto: DasistAuchKeinsehrgutlesbarereSATZ. Aber er braucht wenig Platz :-)
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.