Strings vergleichen wenn Sonderzeichen enthalten sind

Gast #577414
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
Persönliche Seite #577424
Lesenswert?

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

Dann wird es so übersichtlicher:
1
switch (*(int *) buffer))
2
{
3
  case 0x0001:
4
    machwas();
5
    break;
6
  case 0x0101:
7
    machwasanderes();
8
    break;
9
  case 0x0102:
10
    lassesbleiben();
11
    break;
12
  default:
13
    machsonstwas();
14
    break;
15
}

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.
Gast #577429
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
Gast #577453
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.
Moderator Persönliche Seite #577457
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.
#577478
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
Gast #577952
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.
Persönliche Seite #577954
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
Gast #578153
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren