sprintf in C - Nullen dynamisch auffüllen

Gast #5251004
Lesenswert?

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);
Gast #5251108
Lesenswert?

@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);
Gast #5251123
Lesenswert?

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.
Angehängte Dateien:
Gast #5251135
Lesenswert?

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)
Gast #5251215
Lesenswert?

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.
Gast #5251228
Lesenswert?

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.
Moderator Persönliche Seite #5251280
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren