strcpy verursacht Programmabsturz // Benutze eine char*



  • cout << "Willst du Axt oder Schwert?(Axt/Schwert)" << endl;
                   //bool bogen;
                   char* axt;
                   cin >> axt;
                   //bogen = strcpy(axt, "Axt");
                  if(strcpy(axt, "Axt")/*bogen*/)
    

    auskommentiert ist mein erster Versuch der auchnicht klappte....

    wenn ich das hier ausführen will macht mein Programm den abgang... ich ahbe es auhc schon mit einem string probiert, aber da will mein Compiler nicht mal den strcpy befehl akzeptieren und schlägt mir als alternative char* vor.... was aber warscheinlich der Grund ist warum das ganze abstürzt....

    Mein Ziel ist es einen string mit einem anderen zu vergleichen um einen boolschen wert (true/false) rauszubekommen.....

    Mfg Jud4s



  • Zum einen versuchst du einen Zeiger zu verwenden der irgendwohin zeigt, aber nicht auf einen reservierten Speicherbereich. Zum anderen, kann es sein das du statt strcpy eher strcmp meintest?



  • wenn du mir jetzt noch sagst wie ich es richtig anwende .... weil selbst mit strcmp schmiert es ab dann --> 👍

    und noch erklärst warum mein Zeiger auf nix Zeigt^^



  • Welchen Header du brauchst entscheidet einzig was für Funktionalität du benötigst. Letzteres weiß ich aber nicht.

    Wegen des Zeigers:

    char* axt;
    

    Ganz klar... Er zeigt auf keinen vernünftigen Speicherbereich. Ich würde an deiner Stelle tatsächlich std::string verwenden:

    cout << "Willst du Axt oder Schwert?(Axt/Schwert)" << endl;
    //bool bogen;
    std::string axt;
    std::getline( std::cin, axt );
    
    //...
    

    Dafür benötigst du u.A. den Header <string>.



  • also warum er auf keinen Speicher Zeigt ist mir zwar immernoch Rätselhaft 😕 und wie dein Codeblock zu dem von mir erwünschten Ergebnis führen soll aber dennoch thx für deine hilfe 😉

    und strcmp kann man nur auf const char* anwenden 😉



  • Was soll denn dein Code machen, nach dem der String eingelesen wurde? Vielleicht können wir so dem entgültigen Ergebniscode auf die Schliche kommen? 💡

    Edit:

    und strcmp kann man nur auf const char* anwenden 😉

    std::string (aka std::basic_string< char >) bieten die eine Funktion an, namentlich c_str(), die dir ein const char* liefert. Alternativ gibts aber auch String-Vergleichsfunktionalität für das Template in Form der Operatoren ==, !=, ...



  • also^^.... cih will eine boolsche Variable rausbekommen (true/false) und zwar: ein false wenn die eingabe != Axt war...... (allerdings soll gross und kleinschreibung nicht beachted werden)

    oder allgemein ausgedrückt:

    Mein Ziel ist es einen string mit einem anderen zu vergleichen um einen boolschen wert (true/false) rauszubekommen.....



  • std::string blubb = "axt";
    bool ist_axt = blubb == "axt";
    


  • @buhl: da wird leider auf Groß und kleinschreibung geachted.....



  • Jud4s schrieb:

    also^^.... cih will eine boolsche Variable rausbekommen (true/false) und zwar: ein false wenn die eingabe != Axt war...... (allerdings soll gross und kleinschreibung nicht beachted werden)

    oder allgemein ausgedrückt:

    Mein Ziel ist es einen string mit einem anderen zu vergleichen um einen boolschen wert (true/false) rauszubekommen.....

    Du musst

    !strcmp(...)
    

    nehmen, weil diese Funktion true zurückgibt, wenn die Strings verschieden sind. Ich hab mich selber schon gefragt, was damit bezweckt wird 🙄
    Um Gross- und Kleinbuchstaben als gleich anzusehen, solltest du eventuell noch eine Funktion schreiben, die alles in Gross- oder Kleinbuchstaben umwandelt und dann die beiden Strings so vergleicht. Oder gibts schon etwas in der Art?

    David_pb schrieb:

    std::string (aka std::basic_string< char >) bieten die eine Funktion an, namentlich c_str(), die dir ein const char* liefert. Alternativ gibts aber auch String-Vergleichsfunktionalität für das Template in Form der Operatoren ==, !=, ...

    Ich denke, der Threadersteller will es mit char machen, klar wäre std::string einfacher.



  • in meinem lehrbuch wird strcpy angeboten..... und ich dachte mir "hmm ist doch n dolle sache" vergleich ohne beachtung von gross und kleinschreibung.... benutzerfreundlich".... nur irgendwie habe ich was in der Anwendung falsch gemacht... konnte aber das Beispiel im Lehrbuch nicht konvertieren (Anpassen) das es mir hilft.... 😞 und ich dachte hier kennt einer den Befehl.....^^



  • Per std::string könnte es folgendermaßen aussehen:

    std::cout << "Willst du Axt oder Schwert?(Axt/Schwert)" << std::endl;
    //bool bogen;
    std::string axt;
    std::getline( std::cin, axt ); 
    
    // string in Kleinbuchstaben umwandeln, vonwegen casesensitiv uswusf
    std::transform( axt.begin(), axt.end(), axt.begin(), std::tolower );
    
    // true wenn text = 'axt', sonst false
    bool foobar = axt == "axt";
    

    Ansonsten benötigst du halt einen Speicherbereich in den du deinen String einlesen kannst. Reservieren könntest du z.B. per new[] operator.

    Nexus schrieb:

    weil diese Funktion true zurückgibt, wenn die Strings verschieden sind. Ich hab mich selber schon gefragt, was damit bezweckt wird 🙄

    Ganz einfach. Es wird nämlich nicht true zurückgegeben wenn die String verschieden sind sondern Zahlen < oder > 0, je nachdem welcher String größer ist und 0 wenn die Strings gleich sind.



  • Jud4s schrieb:

    also warum er auf keinen Speicher Zeigt ist mir zwar immernoch Rätselhaft

    cout << "Willst du Axt oder Schwert?(Axt/Schwert)" << endl;
    char* axt; // <-- Dies ist ein uninitialisierter Zeiger der demzufolge irgendwo hinzeigt
    cin >> axt; // Ich bezweifel das es absicht ist in einen zufälligen Speicherbereich zu schreiben...
    

    Du solltest dich falls du wirklich mit C-Strings arbeiten willst erstmal ganz intensiv mit Zeigern beschäftigen.

    Jud4s schrieb:

    und strcmp kann man nur auf const char* anwenden 😉

    strcmp ist auch eine C-Funktion, das die nichts von C++ weiß ist nur logisch.

    Entweder schreib C, oder C++ Code - mischen kann ich nur abraten.
    Und std::string bringt schon einige Methoden und Operatorüberladungen mit (Sowas wie das aufaddieren mittels +, was mit C-Strings nicht geht...).

    Und Vergleichen: http://msdn.microsoft.com/de-de/library/ec100fs2.aspx
    (Schau dir einfach das Beispiel an)

    cu André



  • ohh man bin ich blind 😛 ich weiss warum mir das beispiel nicht helfen konnte... es war vollkommen richtig.... nur ihc habe einen buchstaben übersehen .....

    char schilda[10];
         cin >> schilda;
         //schild = strcpy(schilda, "schild");
         if(!stricmp(schilda, "schild"))
    

    so klappt es.... nur ich depp habe das i übersehen... dennoch thx für eure mühen....

    @André thx.... aber ich glaube ich werde mich erstmal lieger ausführlihc mit cpp strings auseinander setzen.... Zeiger sind mir da doch n bsiche zu kompliziert....
    kennst du rein zufällig ein Internettutorial??



  • Jud4s schrieb:

    so klappt es.... nur ich depp habe das i übersehen... dennoch thx für eure mühen....

    Also wenn du weiterhin C Programmierst, sind unsere Mühen eh vergeblich xD



  • Jud4s schrieb:

    ...

    Was passiert eigentlich wenn du mehr als 10 Zeichen eingibst? 🤡



  • dann gibts n Crash schon klar bin ja nicht blööd 😉

    und wieso "wenn ich weiter c progge?" das ist eigtl meiner Ansicht nach cpp lass mich aber gerne belehren.... ;)^^



  • stricmp auf .c_str() ist doch besser und schneller als vorher erst alles toUpper zu machen



  • Jud4s schrieb:

    und wieso "wenn ich weiter c progge?" das ist eigtl meiner Ansicht nach cpp lass mich aber gerne belehren.... ;)^^

    Nun, das ist es durchaus. Allerdings verwendest du brandneue C++ Features gemischt mit der, der Abwärtskompatibilitätshalber mitgeschleppten, C-Funktionalität von C++. Auf solche Mixturen reagieren Leute teilweise alergisch.



  • was ist an meinem Qc denn noch alles an C-Teilstücken drinne die ich verändern sollte.... (um halt ein Lupenreines Cpp zu erhalten)......


Anmelden zum Antworten