Forum: Compiler & IDEs Strings vergleichen wenn Sonderzeichen enthalten sind


von ---=DIAN=--- (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von ---=DIAN=--- (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dann solltest Du vielleicht Dein Konzept überdenken?

von ---=DIAN=--- (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Klaus F. (kfalser)


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

von Arc N. (arc)


Lesenswert?

> 0x0102030405060708

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

von Werner B. (Gast)


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.

von Simon K. (simon) Benutzerseite


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

von Florian (Gast)


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.

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.