mikrocontroller.net

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


Autor: Schuster (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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);

Autor: Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder die Doku zur avrlibc...

Oliver

Autor: John Doe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
evtl.
char fmt[32];

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

Autor: John Doe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
evtl so (korrigiert).
char fmt[32];

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Thosch38 (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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);

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: John Doe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thosch38 (Gast)

>So geht das natürlich nicht...

Wieso sollte das nicht gehen (wenn "%0*i" nicht verfügbar)?
char fmt[32];

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

Autor: W.S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
-4 lesenswert
nicht 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.

Autor: John Doe (Gast)
Datum:

Bewertung
3 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schuster schrieb:
> sprintf(MyCharArray, "%0[X]i", MyInt);
  char format[6];
  sprintf( format, "%%0%di", X );
  sprintf(MyCharArray, format, MyInt);

: Bearbeitet durch User
Autor: Dr. Sommer (Gast)
Datum:

Bewertung
5 lesenswert
nicht 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)

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
4 lesenswert
nicht 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

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
3 lesenswert
nicht 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.

Autor: W.S. (Gast)
Datum:

Bewertung
-5 lesenswert
nicht 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.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
3 lesenswert
nicht 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.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
4 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.