String in String-Array suchen
-
Hallo,
ich versuche gerade zu überprüfen, ob sich eine bestimmte Zeichenkette in einem Array von Strings befindet und die Array-Position dieser herauszufinden, um den 'zugehörigen' Zahlenwert in einem anderen Array zurückzugeben.
Leider gelingt es mir nur zu einem kleinen Teil: Es gelingt, wenn es sich bei der zu findendem Zeichenkette um jene an Position 0 im Array handelt.
Evtl. kann mir jemand aufzeigen, wo mein Denkfehler liegt, bzw. was ich scheinbar nicht/falsch verstanden habe.So sieht mein Versuch bisher aus:
static const unsigned char noteNames[13][3] = {"c-4", "c#4", "d-4", "d#4", "e-4", "f-4", "f#4", "g-4", "g#4", "a-4", "a#4", "b-4", "000"}; static const float noteFrequencies[] = {261.626, 277.183, 293.665, 311.127, 329.628, 349.228, 369.994, 391.995, 415.305, 440.000, 466.164, 493.883, 0.0}; float getNoteFrequency(char noteName[3]) { int i; float frequency = 0.0; char noteToSearch[3]; for(i = 0; i < 12; i++) { strncpy(noteToSearch, noteNames[i], 3); if(strcmp(noteName, noteToSearch) == 0) { frequency = noteFrequencies[i]; break; } } return frequency; }
Gerne nehme ich auch Hinweise entgegen, dass die Art und Weise meines Vorgehens unüblich ist, und wie es richtig umgesetzt wird.
(Zudem hoffe ich, mich in meinem ersten Post korrekt verhalten zu haben :))
-
Deine Arrays sind zu klein.
Ein String mit drei Zeichen braucht vier Byte, da noch der Stringterminator dazu kommt.
Und für Zeichen nimmt man den Variablentyp char (ohne Angabe des Vorzeichens).
Dann machst du aus noteNames noch ein
*char[]
Also ein Array mit Zeigern aufchar
, dann brauchst du dich um die Länge der Strings auch nicht mehr kümmern.
Als letztes Element kommt ein NULL-Zeiger zur Endekennung.Die Kopie vom String brauchst du auch nicht.
static const char *noteNames[] = {"c-4", "c#4", "d-4", "d#4", "e-4", "f-4", "f#4", "g-4", "g#4", "a-4", "a#4", "b-4", NULL}; static const float noteFrequencies[] = {261.626, 277.183, 293.665, 311.127, 329.628, 349.228, 369.994, 391.995, 415.305, 440.000, 466.164, 493.883, 0.0}; float getNoteFrequency(char noteName[]) { int i; float frequency = 0.0; for(i = 0; noteNames[i]; i++) { if(strcmp(noteNames[i], noteName) == 0) { frequency = noteFrequencies[i]; return frequency; } } return 0.0; }
Du kannst auch eine Struct machen, in der Notenbezeichnung und frequenz zusammen gehalten werden. Dann brauchst du nur ein Array.
-
Tausend Dank!