Forum: Compiler & IDEs sprintf in C - Nullen dynamisch auffüllen


von Schuster (Gast)


Lesenswert?

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

von Schneider (Gast)


Lesenswert?


von Oliver S. (oliverso)


Lesenswert?

... oder die Doku zur avrlibc...

Oliver

von John Doe (Gast)


Lesenswert?

evtl.
char fmt[32];

snprintf(fmt, sizeof(fmt) "%%0%ui", X);
snprintf(MyCharArray, sizeof(MyCharArray), MyInt);

von John Doe (Gast)


Lesenswert?

evtl so (korrigiert).
char fmt[32];

snprintf(fmt, sizeof(fmt) "%%0%ui", X);
snprintf(MyCharArray, sizeof(MyCharArray), fmt, MyInt);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein richtiges printf kennt "*".
Und dann sieht das ganze so aus:
1
sprintf(MyCharArray, "%0*i", breite, MyInt);

von Thosch38 (Gast)


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

von Oliver S. (oliverso)


Lesenswert?

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
von John Doe (Gast)


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

von W.S. (Gast)


Angehängte Dateien:

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.

von John Doe (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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
von Dr. Sommer (Gast)


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)

von Dr. Sommer (Gast)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von W.S. (Gast)


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.

von Dr. Sommer (Gast)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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

: 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
Noch kein Account? Hier anmelden.