Forum: Mikrocontroller und Digitale Elektronik char in ein string


von Marcel (Gast)


Lesenswert?

Hallo Forumgemeinde!!

Ich weiß, es ist ein leidiges Thema, aber ich habe im Forum kein
passenden Beitrag gefunden.

Ich möchte eine Uhrzeit auf dem LCD anzeigen lassen. Jetzt will ich
dass die Uhrzeit in einem string steht. So nach der Art:  12:34:56 !!
Ich habe ein Byte mit den Stunden. Dieses Byte soll dann mit einem
":" in das string geschrieben werden. Dann wird in das alte Byte für
die Stunden die Minuten geschrieben. USW.


Erst habe ich alles in drei Strings geschrieben und dann mit >strcat<
an das erste angeängt. Das ist aber bestimmt der umständlichste Weg!

Mein Problem ist, ich weiß nicht so genau wie ich das "progen" soll.
Erst dachte ich mit >sprintf< aber ich glaube über Zeiger ist das
besser, da ich dann wirklich auf die einzelne Elemente [i] zugreifen
kann. So bekomme ich dann aber Probleme wie ich es an das LCD schicke.
Das funktioniert dann auch nichts (es wird nichts angezeigt)
Kann mir jemand einen "schubster" geben???

Grüße,

Marcel

von Lokko (Gast)


Lesenswert?

char text[16];
unsigned char stunden,minuten,sekunden;
unsigned char uhrzeit[3];

//jetzt irgendwie die uhrzeit in die variablen

//mit sprintf in einen String schreiben
sprintf(text,"%d:%d:%d",stunden,minuten,sekunden);
oder
sprintf(text,"%d:%d:%d",uhrzeit[0],uhrzeit[1],uhrzeit[2]);
//Im Dispaly anzeigen z.B. display_put_string(char *text)
display_put_string(text);

die display_put_string ist natürlich nur ein Beispiel und muss durch ne
Funtion ersetzt werden, die was auf dein Display schreibt

von Karl H. (kbuchegg)


Lesenswert?

Noch ein kleiner Tip
In den Formatierungen bei sprintf kann man
eine ganze Menge machen. Zb. kann man dem Ding
sagen, dass man die Zahl immer auf 2 Stellen
haben moechte und dass, falls die Zahl nur eine
Stelle umfasst, mit führenden Nullen aufgefüllt werden
soll:

  sprintf( text, "%02d:%02d:%02d", stunden, minuten, sekunden );

von Marcel (Gast)


Lesenswert?

@ Lokko:
Jo, jetzt geht's!!! Vielen Dank für deine schnelle Hilfe!!
Ich könnte schwöre ich hatte es vorhin so ähnlich gehabt. Aber jetzt
geht es zum Glück. freu

@ Karl Heinz:
Ja, das ist eine nützliche Funktion. Dann steht bei einstelligen Zahlen
trotzdem eine 0 vorne dran, Danke!!!


Jetzt habe ich aber noch eine Frage. Mir geht es jetzt nicht darum
Variablen zu sparen, sonder einfach darum das ich es einfach nicht hin
bekomme. Das "fuchst" mich schon sehr.

Kann man es nicht auch so ähnlich realisieren:

zeitbyte = stunden -->(12)

string = zeitbyte -->(12)

zeitbyte = minuten -->(34)

string = zeitbyte -->(12:34)

zeitbyte = sekunden -->(56)

string = zeitbyte -->(12:34:56)

Ich bin mir fast sicher dass das mit Zeigern gehen müsste!!! Aber der
erste Vorschlag würde schon reichen.... aber das kann man doch bestimmt
auch mal wo anders gebrauchen. Mir gehts nur ums Prinzip.

Grüße Marcel

von Karl H. (kbuchegg)


Lesenswert?

Ich bin mir nicht sicher was Du mit 'mit Zeigern gehen'
meinst. Aus Deinem 'Beispiel' werde ich auch nicht schlau
was Du eventuell meinen könntest.

von Marcel (Gast)


Lesenswert?

Hmm, ich meine z.B. so etwas in der Art....

char *zeiger;

zeiger[0] = zeitbyte;   --> oder auch *(zeiger+0) = zeitbyte
zeiger[2] = ':';
....
zeiger[3] = zeitbyte;
zeiger[4] = ':';
....
zeiger[5] = zeitbyte;

So irgenwie müsst das doch gehen???

Oder liege ich da falsch????

Gruß Marcel

von Karl H. (kbuchegg)


Lesenswert?

Eventuell bist Du auf der Suche nach sowas:

  char Text[9];

  Text[0] = Stunden / 10 + '0';
  Text[1] = Stunden % 10 + '0';
  Text[2] = ':';
  Text[3] = Minuten / 10 + '0';
  Text[4] = Minuten % 10 + '0';
  Text[5] = ':';
  Text[6] = Sekunden / 10 + '0';
  Text[7] = Sekunden % 10 + '0';
  Text[8] = '\0';

Das kann man dann auch in eine Zeiger Loesung umpfriemeln:

  char Text[9];
  char* pDest = Text;

  *pDest++ = Stunden / 10 + '0';
  *pDest++ = Stunden % 10 + '0';
  *pDest++ = ':';
  *pDest++ = Minuten / 10 + '0';
  *pDest++ = Minuten % 10 + '0';
  *pDest++ = ':';
  *pDest++ = Sekunden / 10 + '0';
  *pDest++ = Sekunden % 10 + '0';
  *pDest++ = '\0';

von Marcel (Gast)


Lesenswert?

Hmmm, das habe ich noch nie gesehen. Sieht aber interessant aus. Das
muss ich mal ausprobieren. Ich kenne die Befehle: /10 + '0' & %10 +
'0' NICHT. Aber ich könnte mir vorstellen das so erste die vordere
Zahl und dann die hintere Zahl eingesen wird, oder??

von Karl H. (kbuchegg)


Lesenswert?

Nimm eine Zahl. Sagen wir 35.

Was ergibt   35 / 10    ->  3
Was ergibt   35 % 10    ->  5

(% ergibt den Rest einer Division. So wie Du es in
der Grundschule gelernt hast: Eine Mutter hat 7 Äpfel
und 3 Kinder. Wieviele Äpfel kriegt jedes Kind und wieviele
Äpfel bleiben übrig, wenn ein Apfel nicht geteilt werden kann)

Damit hast Du die Zahl 35 in die einzelnen Ziffern 3 und
5 zerlegt.
Nun kannst Du aber nicht Ziffern an das Display schicken.
Das Display will Zeichen in Form von Codes. Jedes Zeichen,
also zb. 'a', 'b', 'c', 'x' oder auch '/', ':' oder eben
auch '0', '1', '2', '9', hat einen bestimmten Code. Das
ist ganz einfach eine Zahl. zb hat das Zeichen '0' die
Zahl 48 im ASCII Code.
Um nun die Ziffer 0 in den Code 48 zu verwandeln, zähle
ich ganz einfach 48 dazu. Nun will ich mir die 48 aber nicht
merken muessen. Das kann der Compiler viel besser. Also
sag ich ihm, dass er den Code fuer '0' noch dazu zaehlen
soll:

    Irgendwas + '0'

Ergibt den Code fuer Irgendwas, solange Irgendwas (als Zahl)
nur zwischen 0 und 9 ist. Da die Codes fuer '0', '1', '2',
'3', ... '9' alle aufsteigend sind und aufeinander folgen,
funktioniert das auch.
Aus 0  wird '0'   (Code 48)
    1       '1'   (Code 49)
    2       '2'   (Code 50)
    3       '3'   (Code 51)
       ....

Tja. Das wars im Grunde. Setze die Einzelteile zusammen
und du kriegst:

   Text[0] = Stunden / 10 + '0';
   Text[1] = Stunden % 10 + '0';
   ....

Im Endeffekt entsteht in Text ein String, der dann ganz
normal als String ausgegeben werden kann. Genauso wie
auch sprintf den String befuellt.

von Marcel (Gast)


Lesenswert?

Hey KLASSE !! Vielen Dank!! Da habe ich echt wieder mal etwas
dazugelernt!! Das hört sich so ganz einfach an g

Das werde ich Morgen in aller ruhe mal ausprobieren.
Noch mal danke und gute Nacht :o)

Marcel

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.