Forum: Compiler & IDEs strcmp_P für einzelne chars eines Strings


von Ralle (Gast)


Lesenswert?

Hallo zusammen,

ich sitze an einem Programm in AVR-GCC, das über die serielle 
Schnitstelle bei bestimmten Befehlen Portpins schalten soll.

Der Vergleich kompletter Strings funktioniert, also z.B. folgendes:

if (!strcmp_P (stringbuffer, PSTR ("\n\rHallo_alle"))) // funktioniert

genauso auch:

static char Empfang_test[13] PROGMEM = "\n\rHallo_alle";
if (!strcmp_P (stringbuffer, Empfang_test)) // funktioniert



Was nicht funktioniert ist der Vergleich einzelner Zeichen:

static char Empfang_test[13] PROGMEM = "\n\rHallo_alle";
if (!strcmp_P (stringbuffer[3], Empfang_test[3])) // funktioniert nicht

Das brauche ich z.B. um diesen String auf ein "Hallo" zu testen. Den 
Test auf ein "Hallo" würde ich dann so realisieren:
if (!strcmp_P(stringbuffer[3],Empfang_test[3]) && 
!strcmp_P(stringbuffer[4],Empfang_test[4])) && .. ) usw.
(Mit der Beschreibung auf 
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#gae3a7686c2e207b543be3b402d919761a 
durschaue ich das Problem noch nicht)

Warum funktioniert der Vergleich nicht für einzelne Zeichen in einem 
String?

von rr (Gast)


Lesenswert?

memcmp_P

von Klaus W. (mfgkw)


Lesenswert?

Ralle schrieb:
> Warum funktioniert der Vergleich nicht für einzelne Zeichen in einem
> String?

Weil strcmp generell immer bis zu einer abschließenden '\0' vergleicht.

von Ralle (Gast)


Lesenswert?

Genial! Vielen Dank rr, memcmp_P löst mein Problem.
Vielen Dank Klaus für das Wissen. Das behalte ich mal im Hinterkopf, 
dann könnte strcmp_P mit einem String mit einer künstlich eingefügten \0 
verwendet werden. Das erweist sich als nützlich :)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du willst einzelne Zeichen vergleichen?

Warum dafür strcmp verwenden? Du musst nur die Zeichen der beiden 
Strings direkt miteinander vergleichen:

Statt

  if (!strcmp_P (stringbuffer[3], Empfang_test[3])) // funktioniert 
nicht

also

  if (stringbuffer[3] == Empfang_test[3])

Wegen der praktischen AVR-Architektur geht das natürlich so nicht, den 
Zugriff auf den im Flash gespeicherten String musst Du noch hinzufügen:


  if (stringbuffer[3] == pgm_read_byte(&Empfang_test[3]))

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.