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.
gibt es denn eine sinnvolle alternative? zb. alle substings in ein eindimn. array zu packen, die man evtl. per Token voneinander trennt?
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 | }
|
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.