Forum: Compiler & IDEs printf_Problem


von C-Kämpfer (Gast)


Lesenswert?

Hallo

ich bastle gerade an meiner Funkuhr und möchte folgenden String über die 
serielle Schnitstelle schicken:

<STX>D:tt.mm.jj;T:w;U:hh.mm.ss<ETX>

Ich habe folgendes Printf-Statement:
    printf("\x02D:%d.%d.%d;T:?;U:%d.%d.%d\x03",day,mon,year,hh,mm,ss);

mein problem ist nun dass am Anfang ein - kommt es soll aber

 <STX>D:24.02.2007;T:?;U:20.16.58<ETX>
kommen

1. Problem warum kommt kein <STX>D am Anfang?
2. Problem  die Ziffern sollen immer 2 stellig ausgegeben werden, falls 
1 stellig sool ne führende 0 ausgegeben werden
   Frage hierzu: Kann man das mit nem Formatstring machen? Oder nur mit 
Programmlogik?

 Kann mir BITTE jemand weiterhelfen, ich bin schon am verzweifeln....

 MfG
 Achim

Terminal Trace.....

2D   -       Mein Problem
3A   :
32   2
34   4
2E   .
32   2       Mein Problem
2E   .
32   2
30   0
30   0
37   7
3B   ;
54   T
3A   :
3F   ?
3B   ;
55   U
3A   :
32   2
30   0
2E   .
31   1
36   6
2E   .
35   5
38   8
03  <ETX>

von Benedikt K. (benedikt)


Lesenswert?

Zu dem Fehler kann ich nichts sagen, aber 2 stellig geht so:
%02d
0: mit 0er Auffüllen
2: 2 Stellen

von C-Kämpfer (Gast)


Lesenswert?

Hallo

@Benedikt Vielen Dank, Punkt 2 ist erledigt (wer lesen kann ist klar im 
Vorteil RTFM)

Problem 1 bleibt.....

Falls ich printf("\x02 
D:%d.%d.%d;T:?;U:%d.%d.%d\x03",day,mon,year,hh,mm,ss);

also zwischen \02 und D ein ' ' "einschiebe kommt es fast so raus wie 
ich möchte, aber eben ein BLANK  welches ich nicht haben möchte....

also <STX> D ich möchte aber <STX>D

Kann mir noch jemand helfen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klar, ist ganz einfach: \x02D ergibt das Zeichen 0x002D.  Da du nur
8-bit-Zeichen benutzt, wird es auf 0x2D (ASCII Minus) eingekürzt.

ANSI C89 (alias ISO C90) hat dafür den Trick eingeführt, dass zwei
unmittelbar aufeinander folgende string literals zu einem einzigen
verkettet werden, du schreibst also
1
"\x02" "D..."

Wenn du das noch etwas schicker machen willst, nimmst du
1
#define STX "\x02"
2
3
...
4
printf(STX "D...", ...);

von C-Kämpfer (Gast)


Lesenswert?

Hallo

@Jörg, herzlichen Dank! Du hast den Abend gerettet! Wie kann man das aus 
dem Manuals rauslesen.....
Ich hatte ne Quelle da stand \xnn wobei nn Hexziffern sind. Ich dachte 
das sind 2 Hexziffern. Was wäre dann \x123456789ABCDEF  bei byte nur das 
EF... kann der HEX String beliebig lang sein und wird abhängig vom 
Datentyp von hinten interpretiert.....


Danke
Achim

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, der Hexstring kann beliebig lang sein, er wird erst durch das
erste nicht-hex-Zeichen beendet.

Im Gegensatz dazu wird eine Oktalfolge \NNN durch wahlweise das
erste nicht-oktal-Zeichen oder das vierte Zeichen nach dem
Backslash beendet.

Sollte aber im K&R eindeutig beschrieben sein, im Standard steht
es auf jeden Fall eindeutig.

von C-Kämpfer (Gast)


Lesenswert?

-----DANKE------
Achim

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.