Forum: Compiler & IDEs char als string übergeben, warum geht nicht?


von maccallan (Gast)


Lesenswert?

hallo,
ich will an eine funktion, die einen string verarbeitet nur einen char
übergeben. jetzt brauche ich dazu ja eigentlich nur die adresse des
char  dazu angeben, also &variablenname.
habe ich zumindest gedacht, der char wird auch richtig ausgegeben, aber
dahinter kommt noch etwa 1-4 chars mist.
liegt das daran, dass bei einem string als letztes zeichen immer eine
art EOF nur auf strings bezogen ist, was natürlich beim char fehlt und
die funktion(hier lcd_puts) solange im speicher liest bis sie etwas
dergleichen findet?
wenn dem so ist(denke ich mal) wie könnte ich das problem umgehen? ziel
soll sein, dass ich von einem string immer nur ein element an die
lcd_puts schicken will;

hier eine beispielanwendung, die funktion lcd_puts() ist die von peter
fleury als beispiel, die habe ich nur zum debuggen, in meiner funktion
habe ich das gleiche problem.


void action_message(uint8_t *string){
uint8_t temp;
while(*string){
  temp= *string;
  lcd_home();lcd_puts(&temp);
        string++;
        }
}

ich danke euch!

von JojoS (Gast)


Lesenswert?

ein String in C hat per Definition als Endekennung eine Null, sonst
wüssten die Funktionen ja nicht wie lang ein String ist. Es wird also
soviel 'Müll' mitausgegeben bis eine Null gefunden wird. Du musst
also dafür sorgen das hinter deinem char eine Null steht.

von maccallan (Gast)


Lesenswert?

ahhh jetzt wirds mir klar...
ich habe das problem nun so umgangen:

uint8_t *s="t";
  while(*string){
  s[0]=*string;

alternatov könnte ich ein char array declarieren mit 2 stellen, wobei
die zweite = 0 ist.

ich danke dir!

von JojoS (Gast)


Lesenswert?

uint8_t *s="t";
erzeugt zwei Zeichen: 't' und 0x00. Damit hast du einen String der
Nullterminiert ist.
  s[0]=*string;
ist da unnötig, es führt nur dazu das immer das erste Zeichen
verarbeitet wird. Wenn aber gar keine Null folgt hast du eine Schleife
die viel zu oft durchlaufen wird (könnte theoretisch sogar endlos
sein).
  while(*string)
ist heist ja 'laufe solange das Zeichen auf das string zeigt ungleich
0 ist'.

von maccallan (Gast)


Lesenswert?

hmm ich will ja immer nur ein zeichen verarbeiten.
ich habe es letztendlich so gemacht:

void action_message(uint8_t *string){
  uint8_t i=0;
  uint8_t temp[2]={1,0};

    while(*string){
      temp[0]= *string;
      lcd_home();lcd_puts(temp);
                        }
wenn ich jetzt temp übergebe, folgt auf das erste zeichen, dass mich
interessiert immer eine 0.
(es ist leider wichtig, das immer nur ein teil verarbeitet wird, um
z.b. ein delay o.ä. zu verarbeiten)
allerdings verstehe ich gerade nicht, warum es auch funktioniert, wenn
ich als abschlusszeichen eines nehme !=0 zum beispiel 49 (also
temp[2]={0,49}, das kann ja kein zufall sein.

von JojoS (Gast)


Lesenswert?

ist auch kein Zufall. Deine Schleife wird eben mehrmals durchlaufen bis
eine Null kommt. Und wenn du in der Schleife auf lcd_home springst und
das Zeichen ausgibst dann siehst du das bei ein paar Zeichen nicht.
Ich kenne die die lcd_ lib/funktionen nicht. Gibt es evtl. ein lcd_put
oder lcd_putc was nur ein char ausgibt ? Wenn nicht, gibt es die
Quellen ? Dann sollte es einfach sein aus lcd_puts() die Schleife
auszubauen und nur ein Zeichen auszugeben. Das ist doch meistens so
geschachtelt.

von maccallan (Gast)


Lesenswert?

hmmm vielleicht habe ich mich immer etwas wirr ausgedrückt, dein hinweis
mit zeichen die es nicht gibt, war entscheidend.
nehme ich gültige zeichen wie zum beispiel 0x58 = 'X' und dahinter
erst eine null wie hier:
void action_message(uint8_t *string){
  uint8_t i=0;
  uint8_t temp[3]={0,88,0};
    while(*string){
      temp[0]= *string;
      lcd_home();lcd_puts(temp);
                        }
handelt er in lcd_puts() immer ein char vom string string ab und
schreibt ein X dahinter, wie ich es mir gedacht hatte.

ein zeiger auf den anfang eines char arrays indem das letzte element
0x00 ist ist also das gleiche wie ein zeiger auf einen string, das ist
trivial aber ich habs jetzt gerallt, danke!

sicherlich mag es idiotisch erscheinen, aber die funktion die ich
ansprechen will (nicht die lcd_puts) darf nicht geändert werden.

gruß
m.

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.