Forum: Compiler & IDEs sprintf mit mehreren parametern


von Chriss (Gast)


Lesenswert?

Hallo Leute

hab zu sprintf folgende hilfe gefunden:
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html

Mir is leider nicht ganz klar, wie ich die anderen parameter wie
[width][.precision][length]
angebe...?

So sieht mein Code bis jetzt aus:
sprintf(OutBuff, "%X", data);

Die parameter die ich noch angeben möchte sind:
1.) left-justify within the given field width
2.) field width

Hab auch schon gegoogelt, leider nichts hilfreiches gefunden:

Des weitern wollte ich fragen, ob es eine Möglichkeit gibt, die 
Null-Terminierung von sprintf auszuschalten?

schöne Grüße

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Beispiele:

data = 0x1234;

sprintf(OutBuff, "%07X", data);

-> "0001234"


sprintf(OutBuff, "%7X", data);

-> "   1234" (drei Leerzeichen davor)


sprintf(OutBuff, "%-7X", data);

-> "1234   " (drei Leerzeichen dahinter)


Wie genau möchtest Du Deinen Wert formatiert ausgeben?

von Karl H. (kbuchegg)


Lesenswert?

Chriss wrote:
> Hallo Leute
>
> hab zu sprintf folgende hilfe gefunden:
> http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html
>
> Mir is leider nicht ganz klar, wie ich die anderen parameter wie
> [width][.precision][length]
> angebe...?

Einfach in den Format String reinschreiben.
>
> So sieht mein Code bis jetzt aus:
> sprintf(OutBuff, "%X", data);
sprintf( OutBuff, "%3X", data);

spezifiziert eine Feldbreite von 3 Zeichen

sprintf( OutBuff, "%03X", data);

Feldbreite von 3 Zeichen. Mit 0-en auffüllen.
Wie jetzt left-justify im Formatstring angegeben
wird, weiss ich nicht auswendig. Ich nehme mal an
durch ein '-'
also
sprintf( OutBuff, "%-03X", data );

also einfach alles was du haben willst zwischen % und
dem Datentyp-Spezifizierer in der Richtigen Reihenfolge
hineinpacken.

Die Welt kann manchmal so einfach sein :-)

> Des weitern wollte ich fragen, ob es eine Möglichkeit gibt, die
> Null-Terminierung von sprintf auszuschalten?

Nein. Wozu willst du das?
sprintf erzeugt einen C-String. Und ein C-String ist immer
mit '\0' terminiert. Ansonsten wäre es kein C-String.

von Chriss (Gast)


Lesenswert?

>> Des weitern wollte ich fragen, ob es eine Möglichkeit gibt, die
>> Null-Terminierung von sprintf auszuschalten?

> Nein. Wozu willst du das?
> sprintf erzeugt einen C-String. Und ein C-String ist *immer*
> mit '\0' terminiert. Ansonsten wäre es kein C-String.

Ich habe eine funktion, die mir, aus mehreren parametern einen frame zum 
übertragen über den uart zusammenstöpselt:

generate_send_frame(u8 source, u8 destination, u16 command,...)

so etwa in der art...
diese funktion generiert mir dann mit den daten die ich übergebe mein 
frame in einem byte array das dann über den uart gesendet werden kann.
Und genau hier verwende ich eben das sprintf, da ich zwischen start und 
endzeichen nur ascii zeichen übertrage.

schöne Grüße

von Karl H. (kbuchegg)


Lesenswert?

Chriss wrote:
> so etwa in der art...
> diese funktion generiert mir dann mit den daten die ich übergebe mein
> frame in einem byte array das dann über den uart gesendet werden kann.
> Und genau hier verwende ich eben das sprintf, da ich zwischen start und
> endzeichen nur ascii zeichen übertrage.

Wenn du sowieso eigene Ende-Zeichen benutzt, dann stört doch
das terminierende '\0' nicht weiter.
Es hilft allerdings sehr, wenn du auf den String Funktionen
wie strlen, strcpy, strcat, etc... anwenden willst .-)

von Chriss (Gast)


Lesenswert?

Karl heinz Buchegger:
Danke
Auf jeden Fall ein großes Lob an dich, hast mir schon mehrmals 
geholfen...

Mach weiter so!

schöne Grüße

von Christian (Gast)


Lesenswert?

Folgender Code funktioniert bei mir nicht richtig:
1
#include <stdio.h>
2
uint8_t i;
3
const uint32_t Device_Serial2 = 0x00;
4
i = sprintf( signatureString, "%08X", Device_Serial2 );

Compiler ARM GCC von CrossWorks.
In signatureString steht 8X
Ich erwarte eigentlich 00000000 da ich den String gerne als 
hexadezimalen String mit fester Länge von 8 Zeichen hätte - egal wie 
groß Device_Serial2 tatsächlich ist.
Was stimmt bei den Formatierungsparametern nicht?
Mit "%X" bekomme ich ein hex Ergebnis, aber leider ohne führende 
Nullen...
Unterstützt sprintf die Optionen nicht?

von Klaus W. (mfgkw)


Lesenswert?

Das 0 in %08X muß eine Null sein, kein goßes Ohhh.
Was ist es bei dir? Ich kann das auf meine alten Tage schlecht 
unterscheiden.

Ansonsten kann es auch sein, daß du ein abgemagertes sprintf hast, das 
nciht alle Formatoptionen kennt. Mal die eigene Doku lesen könnte 
helfen.

von DirkB (Gast)


Lesenswert?

Christian schrieb:
> Unterstützt sprintf die Optionen nicht?

Im ARM CrossWorks Version 2.1 PDF Reference Manual  gefunden:

Some CrossWorks library variants do not support width and precision 
specifiers in order to reduce code and
data space requirements; please ensure that you have selected the 
correct library in the Printf Width/Precision
Support property of the project if you use these.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Das 0 in %08X muß eine Null sein, kein goßes Ohhh.
> Was ist es bei dir?

Es ist die korrekte Null.

> Ich kann das auf meine alten Tage schlecht unterscheiden.

Tip: Richtige Schriftart verwenden. Die mit neueren Windows-Versionen 
mitgelieferte "Consolas" zeigt bei beliebigen Schriftgrößen immer klar 
unterscheidbare Glyphen für 0O, I1l und die Satzzeichen.

Alternativ wäre auch "Andale Mono" oder deren ältere Variante 
"Monotype.com" zu verwenden.

von Christian (Gast)


Lesenswert?

Danke, das war der entscheidende Tipp !!!
Printf Width Precision Supported in den Project Properties auf Yes 
setzen und dann geht es!

von Klaus W. (mfgkw)


Angehängte Dateien:

Lesenswert?

Rufus Τ. Firefly schrieb:
> Tip: Richtige Schriftart verwenden.

Danke, stimmt im Prinzip.
Eigentlich schaffe ich das meistens noch ganz gut, zumindest mit Brille.
Aber tückischerweise nimmt das Board bei Quelltext mehrere Schriftarten; 
siehe Bild.
Im 0x00 in der Initialisierung ist definitiv eine andere Null zu sehen 
als im Formatstring; deshalb hatte ich den Verdacht.
Kann man das nicht geschickter machen?

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Klaus Wachtler schrieb:
> Aber tückischerweise nimmt das Board bei Quelltext mehrere Schriftarten;
> siehe Bild.

Hmm. Bei Dir verwendet das Board anscheinend die Courier und nutzt für 
das Syntax-Highlighting auch noch unterschiedliche Schriftschnitte 
(Fett/normal).

Das sieht bei mir nicht so aus.

Beiliegender Screenshot zeigt Safari unter OS X 10.6, aber mit Firefox 5 
unter XP sieht das bei mir nicht anders aus.

(Wichtig: Da der Screenshot kleiner ist als das Vorschaubildchen, wird 
er hier leicht vergrößert dargestellt, was ihn zu Matsch macht. 
Draufklicken, dann wird er etwas kleiner)

Die Schriftart lässt sich unter FF einstellen:

Im Einstellungsdialog die Seite "Inhalt" aufmachen, dort im Abschnitt 
"Schriftarten & Farben" auf den "Erweitert"-Knopf klicken und unter 
"Feste Breite" die gewünschte andere Schriftart einstellen.

Mein Screenshot zeigt die oben schon erwähnte "Consolas".

von Uwe S. (de0508)


Lesenswert?

Wenn man etwas weniger Speicher verwenden will, dann geht auch diesen 
Libs von ChAN:

"Embedded printf module for AVR"
http://elm-chan.org/docs/avrlib/xitoa.zip

Geschrieben hat er auch noch diese hier:

"Embedded String Functions"
http://elm-chan.org/fsw/strf/xprintf.html

Man beachte die DEFINES, damit lässt sich viel CODE einsparen !

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.