Problem mit strcmp()



  • 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,
    alpha7

    PS: 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


Anmelden zum Antworten