Forum: Mikrocontroller und Digitale Elektronik string vergleichen


von avr stromer (Gast)


Lesenswert?

Hallo,
Ich lese über die uart einen string ein der sieht so aus,
Lcd loeschen=clear

der string steht in pname und mein vergleich funktioniert aber nicht.

was mache ich falsch

mfg
1
if(!strcmp_P(pname,PSTR("clear")) ) 
2
{ 
3
  Lcd_clear():
4
}

von holger (Gast)


Lesenswert?

>was mache ich falsch

Du zeigst nicht den ganzen Code.

von avr stromer (Gast)


Lesenswert?

Der vergleich funktioniert nicht
1
unsigned char pname[] = "Lcd loeschen=clear";

von holger (Gast)


Lesenswert?

>Der vergleich funktioniert nicht
>unsigned char pname[] = "Lcd loeschen=clear";

Natürlich funktioniert der nicht.
strcmp popelt sich das "clear" nicht aus dem String.

von Dirk B. (dirkb2)


Lesenswert?

strcmp vergleicht den ganzen String.

Du möchtest evtl. strstr nehmen.

von avr stromer (Gast)


Lesenswert?

Dirk B. schrieb:
> strcmp vergleicht den ganzen String.
>
> Du möchtest evtl. strstr nehmen.

Ahh na das kann ja nicht gehn.

Ich suche eigentlich eine funktion mit der ich den string vergleichen 
kann und wenn das clear drin vorkommt dann mach etwas

von Timmo H. (masterfx)


Lesenswert?

Also strstr

von Dirk B. (dirkb2)


Lesenswert?

avr stromer schrieb:
 Ich suche eigentlich eine funktion mit der ich den string vergleichen
> kann ...

Das macht strcmp. Gleichheit vom Anfang bis Ende.

avr stromer schrieb:
> ... und wenn das clear drin vorkommt dann mach etwas

Du suchst das Vorkommen von einem Teilstring: strstr

Andere Möglichkeit: nach dem = suchen und dahinter das strcmp 
ansetzen.

von avr stromer (Gast)


Lesenswert?

Leider läuft das bei mir nicht mit dem vetgleich.

ich hab nun versucht was nach dem = ist auszugeben aber das funktioniert 
bei beiden Vergleichen nicht.

kann mir jemand weitethelfen

1
if(!strcmp_P(pname,PSTR("Lcd loeschen=")) )
2
 { 
3
   Lcd_print(pname): 
4
 }
5
6
7
8
9
if(!strcmp_P(pname,PSTR("Lcd loeschen=")) ) 
10
{ 
11
  Lcd_print(pname): 
12
}

von Timmo H. (masterfx)


Lesenswert?

Wie gesagt strcmp vergleicht zwei Stings auf absolute Gleichheit, von 
anfang bis ende. Dein String mit dem du vergleichst ist "Lcd 
loeschen=clear", du willst aber wissen ob "Lcd loeschen=" darin 
vorkommt... klar gibt strcmp dort != 0 zurück. Nimm strstr und schau ob 
!= NULL und gut ist.
strstr liefert dir den Pointer auf den Anfang des Vergleichstrings den 
du suchst. Das was nach dem "=" ist bekommst du also mit "strstr(pname, 
"Lcd loeschen=") + 13"

von Dirk B. (dirkb2)


Lesenswert?

Du kannst auch strncmp (achte auf das n in der Mitte) nehmen.
http://www.cplusplus.com/reference/cstring/strncmp/

von avr stromer (Gast)


Lesenswert?

Wäre das denn so richtig

if(strstr(pname,("Lcd loeschen=")+13)
{
 Lcd_print(pname);
}

von Dirk B. (dirkb2)


Lesenswert?

Nein.

Was willst du erreichen? Was, nicht wie.

von avr stromer (Gast)


Lesenswert?

Dirk B. schrieb:
> Nein.
>
> Was willst du erreichen? Was, nicht wie.

Ich wollte erstmal den string nach dem = ausgeben.

zueest müsste ich ja erstmal wissen wie viele zeichen hinter dem = sind?

von Joachim B. (jar)


Lesenswert?

avr stromer schrieb:
> Ich wollte erstmal den string nach dem = ausgeben.
>
> zueest müsste ich ja erstmal wissen wie viele zeichen hinter dem = sind?

dann versuche es mal mit strstr und suche das =
noch besser du definierst einen (char *) und weisst diesem das 
strstr(string, "=") zu

die Länge nach dem '=' bekommst du mit +1 und strlen

von DirkB (Gast)


Lesenswert?

avr stromer schrieb:
> Ich wollte erstmal den string nach dem = ausgeben.
Geht schon in die Richtung "Wie"

> zueest müsste ich ja erstmal wissen wie viele zeichen hinter dem = sind?
Musst du wirklich?

Zum suchen von einem Zeichen ist strchr besser: 
http://www.cplusplus.com/reference/cstring/strchr/
1
char *p;
2
3
if ((p=strchr(pname,'=')!=NULL) // ist ein = vorhanden
4
{ Lcd_print(p+1);
5
}

von avr stromer (Gast)


Lesenswert?

DirkB schrieb:
> avr stromer schrieb:
>> Ich wollte erstmal den string nach dem = ausgeben.
> Geht schon in die Richtung "Wie"
>
>> zueest müsste ich ja erstmal wissen wie viele zeichen hinter dem = sind?
> Musst du wirklich?
>
> Zum suchen von einem Zeichen ist strchr besser:
> http://www.cplusplus.com/reference/cstring/strchr/
> char *p;
>
> if ((p=strchr(pname,'=')!=NULL) // ist ein = vorhanden
> { Lcd_print(p+1);
> }

wie kann ich den string hinter dem = ausgeben das bekomm ich nicht hin

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das steht in genau der letzten Codezeile vor Deiner Frage.

Liest Du eigentlich auch die Antworten, die Dir gegeben werden?

von Pandur S. (jetztnicht)


Lesenswert?

Hier geht's ja um Controller. Ich nehm daher an, das soll ein command an 
einen controller sein. Ich wuerd den Codieren. Falls nicht allzuviele 
moeglichkeien ausgedrueckt werden sollen, kann man ihn zB  als ein paar 
Bytes ausdruecken. Allenfalls mit einem Protokoll, das nicht auf text 
beruht. Im Prinzip geht es darum, nicht benoetigte, und sinnlose 
Redundanz wegzulassen. Denn wenn der String auf Identitaet geprueft 
wird, kann man ebenso auf "01" pruefen.

von DirkB (Gast)


Lesenswert?

Ich sehe gerade, dass ich eine Klammer vergessen habe:
1
if ((p=strchr(pname,'='))!=NULL) 
2
                        ^ da

avr stromer schrieb:
> wie kann ich den string hinter dem = ausgeben das bekomm ich nicht hin

Du willst Strings zerlegen und kennst dich nicht mit Zeiger aus?

Spiel damit erstmal auf dem PC rum. Da kannst du einfacher ein paar 
printf einfügen oder mit dem Debugger durchsteppen.

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.