www.mikrocontroller.net

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


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timo P (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?
   found = -1;
   for( i = 0; i < 4; ++i ) {
     if( strcmp( IDs[i],"123123123123" ) == 0 )
       found = i;
   }

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

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.