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!
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.
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?
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.
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.
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?
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.
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?
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
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!