Forum: Mikrocontroller und Digitale Elektronik Mehrdimensionales Array per strstr() durchsuchen


von Timo P (Gast)


Lesenswert?

Hallo!

Angenommen ich möchte in einem zweidimensionalen Array 4 12 Stellige IDs 
abspeichern.

char IDs[4][12]



Wie kann ich nach der ID 123123123123 suchen?
Muss ich 4 einzelne Suchen starten?
Oder kann strstr(IDs,"123123123123"); anwenden?

Danke für Antwort!

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> Hallo!
>
> Angenommen ich möchte in einem zweidimensionalen Array 4 12 Stellige IDs
> abspeichern.
>
> char IDs[4][12]

wenn du die ID's als Strings auffassen willst, solltest du die Arrays 
als

char IDs[4][13];

dimensionieren

> Wie kann ich nach der ID 123123123123 suchen?
> Muss ich 4 einzelne Suchen starten?

Ja
Du hast 4 Strings und musst deine Vorgabe mit jeder der 4 Möglichkeiten 
vergleichen.

> Oder kann strstr(IDs,"123123123123"); anwenden?

IDs ist ja kein einzelner String. Also kannst du auch nicht strstr 
sinnvoll verwenden.

d.h. verwenden kannst du es schon, dem strstr ist es ja egal, wie du 
deinen Speicher benutzt. Der vergleicht einfach nur den Suchstring mit 
den Bytes die es ab deiner Startadresse vorfindet. Die Frage ist halt 
immer, wie sinnvoll das dann ist.

von Timo P (Gast)


Lesenswert?

gibt es denn eine sinnvolle alternative? zb. alle substings in ein 
eindimn. array zu packen, die man evtl. per Token voneinander trennt?

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> gibt es denn eine sinnvolle alternative? zb. alle substings in ein
> eindimn. array zu packen, die man evtl. per Token voneinander trennt?

Wo genau liegt jetzt das Problem, wenn du die Abfrage auf die 
(korrigierten) IDs mittels strcmp/strstr in eine Schleife packst, die 
nacheinander alle (in deinem Fall 4) Einzelstrings abklappert?
1
   found = -1;
2
   for( i = 0; i < 4; ++i ) {
3
     if( strcmp( IDs[i],"123123123123" ) == 0 )
4
       found = i;
5
   }

von Timo P (Gast)


Lesenswert?

wo das Prob. liegt? Ist mir etwas zu statisch programmiert.
Zweidimensional war einerseits nur ein Beispiel, andererseits ist es 
dann ja auch nur möglich, wenn ich immer bei einem zweidimensionalen 
bleibe.

werde es einfach so lösen, dass ich eine funktion schreibe, die nur für 
2-dimensionale array funzt und die schleifendurchläufe dann an der einen 
dimension festmacht.

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> wo das Prob. liegt? Ist mir etwas zu statisch programmiert.

was immer das auch heißen mag :-)

> Zweidimensional war einerseits nur ein Beispiel, andererseits ist es
> dann ja auch nur möglich, wenn ich immer bei einem zweidimensionalen
> bleibe.

Was erwartest du.
Ein Array von Strings ist in C nun mal ein 2D Feld.

Stimmt nicht ganz. Könnte auch ein

  char* IDs[4]

  IDs[0] = malloc( 13 * sizeof( char ) );
  strcpy( IDs[0], "ABCABCABC" ),

  ...

sein. Also ein Array von Pointern auf die Strings. Deswegen passt aber 
der Code von weiter oben immer noch. In einer Sammlung von Strings sucht 
man nunmal den richtigen, indem man in einer Schleife alle Strings 
durchgeht. Sofern man natürlich keine höher entwickelten Suchmethoden 
wie binäres Suchen oder Hashing benutzt.

Und gegen das statische: Man kann ja auch noch die Anzahl in ein Makro 
rausziehen, oder den Compiler bitten das selbst abzuzählen.

> werde es einfach so lösen, dass ich eine funktion schreibe, die nur für
> 2-dimensionale array funzt und die schleifendurchläufe dann an der einen
> dimension festmacht.

Gut. Dir ist hoffentlich klar, dass du bei Übergabe eines Arrays 
jegliche Längeninformation verlierst, du die also mitgeben musst.

von Timo P (Gast)


Lesenswert?

Stimmt, das würde die Funktion sehr komplex machen zumindest für die 
Verwendung. wenn ich die Parameter alle übergebe....
Also programmiere ich einfach statisch die strncmp bzw strstr separat.

Hat strncmp in Bezug auf die Abarbeitungszeit einen Vorteil gegenüber 
strstr?

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> Stimmt, das würde die Funktion sehr komplex machen zumindest für die
> Verwendung. wenn ich die Parameter alle übergebe....

Verzeih wenn ich lächele.
Aber das als 'komplex' zu bezeichnen ....
Das ist ganz normales Handwerk :-)

> Also programmiere ich einfach statisch die strncmp bzw strstr separat.

Wozu?
Im Vergleich zur strcmp kostet dir die Schleife so gut wie nichts.

> Hat strncmp in Bezug auf die Abarbeitungszeit einen Vorteil gegenüber
> strstr?

Nachdenken. (Abgesehen davon, dass strstr sowieso die falsche Funktion 
ist)
Was macht strncmp? Was macht strcmp? Wer hat mehr Arbeit? Welche 
Funktion wird daher langsamer sein (sofern es überhaupt einen 
nennenswerten Unterschied macht)

Und nicht zu vergessen:

Erst machs richtig.
Dann sieh dir an, ob die Abarbeitungszeit reicht (ob es nicht ohnehin 
schon schnell genug ist).
Und erst dann denk darüber nach, wo únd wie du Rechenzeit sparen kannst.


Bei 4 Stringvergleichen lohnt es sich noch nicht einmal über mögliche 
Optimierungen nachzudenken.

von Timo P (Gast)


Lesenswert?

strstr ist falsch? mit hilfe dieser fkt könnte ich gucken, ob ein 
substring in einem string vorhanden ist. genau so, wie mit strncmp und 
mit strcmp oder?

von mir aus werde ich strcmp als direkten Vergleich nutzen. An die ID 
muss ich sowieso noch ein Stringendezeichen hängen.

Warum hast du found mit -1 statt mit 0 initialisiert?

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> strstr ist falsch? mit hilfe dieser fkt könnte ich gucken, ob ein
> substring in einem string vorhanden ist.

Ja.
Und, willst du das?

Wenn du 4 Strings hast

   "ABCDEFABCDEF"
   "BCDGHIJ"
   "FAB"
   "BCDEFABCDEFA"

und du hast eine Seriennummer von "FAB", welcher der 4 Strings ist dann 
der Richtige und welche identifizierst du mittels strstr als passend.


> Warum hast du found mit -1 statt mit 0 initialisiert?

Weil 0 ein gültiger Array Index für einen Treffer ist.
Ein Array mit 4 Elementen hat die Einträge 0, 1, 2, 3

von Timo P (Gast)


Lesenswert?

ich habe mich verlesen, dachte da stünde found = 1; quasi als flag.

habe grade erst gesehen, dass dem found nicht 1 sondern i zugewiesen 
wird. Asche über mein Haupt!

Danke für alle Antworten!

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.