Problem mit strcmp()
-
Hi,
ich beschäftige mich noch nicht lange mit c++. Als ich mich mit den verschiedenen Funktionen von c++ auseinander setzte und einige davon versuchte in der Praxis einzusetzen, stieß ich bei der Funktion strcmp() auf ein Problem.
Also, bei diesem Programm wird der Benutzer dazu aufgefordert den Namen eines Gegenstandes einzugeben. So weit so gut.for(int i=1; i<25; i++) { for(int n=1; n<5; n++) { if(strcmp(promt, game_obj[i][n][255])==NULL) { std::cout << game_beschrobj[i] << std::endl; break; }; }; };
Das eingegebene Wort mit insgesamt 25 gespeicherten Gegenständen und 5 verschiedenen Schreibweisen derer verglichen (Groß- und Kleinschreibung, und z.b. bei Apfesaft kann man auch nur Saft schreiben, etc., etc.), und falls eine Übereinstimmung gefunden wird, wird eine Beschreibung des Gegenstandes ausgegeben. Hier das Problem: Während der Schleifendurchläufe stürzt das Programm ab. Wenn ich aber die Schleifendurchläufe extremst reduziere (i<3 und n<2) dann stürzt es nicht ab.
Meine Frage: Warum???Schon mal danke im Voraus,
alpha7
-
Vermutlich weil die ersten beiden Dimensionen nicht groß genug sind. Mit strcmp hat das jedenfalls nix zu tun.
-
wahrscheinlich weil du irgendwann auf nicht definierten Speicher zugreifst.
Wenn du Teilstrings suchst, kannst du auch strstr() verwenden.
-
#include <iostream> #include <string> #include <conio> int main () { char * promt; char * game_obj[25][5][255]; std::string game_beschrobj[25]; game_obj[1][1][255]="lift"; game_obj[1][2][255]="Lift"; game_beschrobj[1]="Eine Lifttüre"; game_obj[2][1][255]="informationstafel"; game_obj[2][2][255]="Informationstafel"; game_obj[2][3][255]="tafel"; game_obj[2][4][255]="Tafel"; game_obj[2][5][255]="information"; game_beschrobj[2]="Ein Informationstafel"; game_obj[3][1][255]="Saft"; game_obj[3][2][255]="saft"; game_beschrobj[3]="Ein ganz gewöhnlicher Saft"; game_obj[4][1][255]="armbanduhr"; game_obj[4][2][255]="Armbanduhr"; game_obj[4][3][255]="uhr"; game_obj[4][4][255]="Uhr"; game_beschrobj[4]="Tick! Tack! Tick! Tack!"; game_obj[5][1][255]="karte"; game_obj[5][2][255]="Karte"; game_beschrobj[5]="Ein sehr schöne Landkarte"; std::cout<<"> "; std::cin>>promt; for(int i=1; i<5; i++) { for(int n=1; n<5; n++) { if(strcmp(promt, game_obj[i][n][255])==NULL) { std::cout << game_beschrobj[i] << std::endl; break; }; }; }; std::cout<<"Press Enter to continue"; getch(); };
Das ist der gesamte Code.
Mit strstr() habs ich auch probiert -> auch absturz.
Und an die Dimensionen kanns (glaub ich) auch nicht liegen.
-
Meinst du nicht auch, dass ein 3dim. Array von Strings eine etwas unelegante Datenstruktur ist?
BTW: Du benutzt in der Schleife im 3. Index 255, der maximal gültige Index ist jedoch 254...
-
Ich weis, ich weis, soll ja nicht schön aussehn sondern nur als Test dienen.
Hab's geändert-> noch immer absturz
.
PS: der compiler meckert überhaupt nicht, sondern lässt das einfach durch...
-
Hast du für prompt irgendwo Speicher reserviert ? Ich sehe in deinem Code nichts. Warum nimmst du dafür nicht auch einen string?
-
Das wird auch nicht funktionieren:
std::cin>>promt;Du musst schon selber Speicher bereitstellen (promt = new char[100]; oder gleich std::string nehmen)
-
Du läufst in der Schleife doch alle Bereiche durch, dabei ist z.B. game_obj[1][3][255] gar nicht definiert, d.h. dieser char* zeigt ins Nirvana.
Wenn du schon <string> inkludierst, sehe ich keinen Grund, warum du nicht std::string benutzt, wie Braunstein schon schrieb.
-
Ich hoffe du hast das mit dem maximalen Index 254 überall geändert und nicht nur in der Schleife.
Ich sehe übrigens noch mehr Fehler bezüglich Indexierung. In C/C++ wird von 0 bis n-1 indexiert und nicht von 1 bis n. Überarbeite alle relevanten Stellen.
btw:
strcmp gibt -1, 0 oder 1 zurück und nicht NULL. Wenn du komplett std::string verwendest, brauchst du 1. dich nicht um irgendwelche Speicherreservierung kümmern und 2. kannst mit dem == Operator vergleichen.
-
groovemaster2002 schrieb:
strcmp gibt -1, 0 oder 1 zurück und nicht NULL.
Damit prüft er, ob die 2 strings identisch sind (auch wenn NULL hier unpassend ist, da es für Zeigerkontexte vorgesehen ist)
-
interpreter schrieb:
Damit prüft er, ob die 2 strings identisch sind
Ist mir schon klar. Aber wie du sagt, NULL ist für Zeigerkontexte vorgesehen und damit unpassend.
-
groovemaster2002 schrieb:
interpreter schrieb:
Damit prüft er, ob die 2 strings identisch sind
Ist mir schon klar. Aber wie du sagt, NULL ist für Zeigerkontexte vorgesehen und damit unpassend.
Ok. Ich dachte, du weißt nicht genau was NULL ist (weil strcmp() ja eben doch ein NULL zurückgeben kann). Naja, egal
-
Heureka! Es funktioniert!
Ich hab euren Rat befolgt und promt auch als std::string initialisiert.Also ein ganz großes Danke,
alpha7PS: ich kenne c++ noch nicht lange und deshalb kenne ich mich noch nicht sooo gut aus, also wird mein code noch nicht eines profis (
) entsprechen