www.mikrocontroller.net

Forum: Compiler & IDEs Strings vergleichen wenn Sonderzeichen enthalten sind


Autor: ---=DIAN=--- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also die grundsätzliche Verwendung von memcmp / strcmp ist mir soweit 
klar und funzt auch ABER ich weiß nicht wie ich folgendes lösen soll:

buffer[1]={0x48,0x49}; // Buffer[5]="01";
if (memcmp(&buffer[0],"00"==0) {Menü 0 Untermenü 0}
if (memcmp(&buffer[0],"01"==0) {Menü 0 Untermenü 1}
if (memcmp(&buffer[0],"10"==0) {Menü 1 Untermenü 0}
if (memcmp(&buffer[0],"11"==0) {Menü 1 Untermenü 1}

DAS IST SOWEIT KLAR, aber wie vergleiche ich:

buffer[5]={0x00,0x01};
if (memcmp(&buffer[0],{0x00,0x01}==0) {tue etwas}

geht ja nicht. und ständig vor dem if ein Temparray[1]={0x00,0x01} usw. 
ist  meines erachtens zu unständlich. in VB würde ich schreiben:

!!! VB Code !!!
if String = chr(0) & chr(1) then {tue dies und das}

geht sowas auch in C ????

Gruß DIAN

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest die beiden aufeinanderfolgenden Bytes in Buffer als 
16-Bit-Wert ansprechen, dann sähe das ganze so aus:
if (*((int *) buffer) == 0x0001)
  machwas();
if (*((int *) buffer) == 0x0101)
  machwasanderes();
if (*((int *) buffer) == 0x0102)
  lassesbleiben();

Dann wird es so übersichtlicher:
switch (*(int *) buffer))
{
  case 0x0001:
    machwas();
    break;
  case 0x0101:
    machwasanderes();
    break;
  case 0x0102:
    lassesbleiben();
    break;
  default:
    machsonstwas();
    break;
}

Hier ist allenfalls die Reihenfolge der Bytes zu klären (->Endianness), 
d.h. in welcher Reihenfolge der genutzte Prozessor MSB und LSB eines 
16-Bit-Wertes im Speicher ablegt.

Autor: ---=DIAN=--- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke, das ist ertmal ne gute Lösung. das ganze kann ich ja dann bis 
32bit ausreizen, das sollte auch reichen, aber was macht man wenn's 
darüber hinaus geht? ich also werte wie 0x0102030405060708 oder so 
brauche?

Gruß DIAN

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann solltest Du vielleicht Dein Konzept überdenken?

Autor: ---=DIAN=--- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;-) gute Antwort...

also schlußfolgere ich daraus, dass C hier an seine Grenzen stößt ?
ist eben doch nicht alles möglich in C ?

naja, werde das Konzept auf Buchstaben umstellen, da hab ich erstmal 27 
zeichen pro Byte die ich garantiert und einfach abfragen kann. ich 
dachte es gibt in C sowas wie

"BLA SÜLZ" kann man auch schreiben als {'B','L','A',' 
','S','Ü','L','Z','\0'}

von mir aus auch in eckigen oder runden Klammern oder mit Semikolon, 
Binderstrich,Punkt, Plus oder & ........ (fast) jede andere 
Programmiersprache kann sowas.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Haken ist dabei, dass du irgendwo den Speicher für das dergestalt
zu generierende Array allozieren musst.  Das kostet dich auf die Dauer
ziemlich viel RAM.  Der GCC kann sowas (Rückgabe eines Wertes aus
einer `brace group') übrigens wirklich, siehe die Implementierung des
PSTR-Makros in der avr-libc.  Dort ist es aber ein Makro, mit dem
explizit im ROM Speicher angefordert wird.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> danke, das ist ertmal ne gute Lösung. das ganze kann ich ja dann bis
> 32bit ausreizen, das sollte auch reichen, aber was macht man wenn's
> darüber hinaus geht? ich also werte wie 0x0102030405060708 oder so
> brauche?

Wenn Du es schaffst eine Switch-Anweisung für 2^32 verschiedene Fälle zu 
schreiben, dann bist Du 200 Jahre alt und längst gestorben :-) .

Außerdem stimmt der Aufruf vom memcmp() nicht.
..
if (memcmp(&buffer[0],"00"==0) {Menü 0 Untermenü 0}
..
muß wohl eher heißen :
if (memcmp(buffer,"00",2) == 0) {Menü 0 Untermenü 0}

Klaus

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 0x0102030405060708

"\x01\x02\x03\x04\x05\x06\x07\x08"

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> also schlußfolgere ich daraus, dass C hier an seine Grenzen stößt ?
> ist eben doch nicht alles möglich in C ?

Wenn der Fahrer nicht fahren kann ist natürlich zuerst das Auto schuld.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner B. wrote:
>> also schlußfolgere ich daraus, dass C hier an seine Grenzen stößt ?
>> ist eben doch nicht alles möglich in C ?
>
> Wenn der Fahrer nicht fahren kann ist natürlich zuerst das Auto schuld.

Ja, sowas in der Art habe ich mir auch dabei gedacht...

Ich wette, dass man in C allein von den verfügbaren Programmiermethoden 
einiges mehr machen kann, als mit anderen Programmiersprachen. Ich sag 
nur Pointer bzw. Pointerarithmetik. Das gibts nicht überall

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, dass das funktioniert bzw. das ist, was Du möchtest?
> buffer[1]={0x48,0x49}; // Buffer[5]="01";

Wenn buffer ein Array von Pointern wäre, also char *buffer[20] oder 
ähnlich, dann würde aber

> if (memcmp(&buffer[0],"00"==0) {Menü 0 Untermenü 0}

auch wenn die Syntax soweit korrekt wäre, mit &buffer[0] die Adresse 
(nicht den Wert) des ersten Pointers holen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.