strcpy verursacht Programmabsturz // Benutze eine char*



  • 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)......



  • Jud4s schrieb:

    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)......

    Eigentlich nur char* und die str... -Funktionen. cout und cin gehören zu den Streams, das ist C++ und somit in Ordnung 😉

    Und zu std::string würde ich dir sowieso raten, es bietet nicht nur mehr Funktionalität, sondern auch mehr Sicherheit und eine einfachere Anwendung.

    @ David_pb: Danke für die Erklärung von strcmp(). Obwohl ich diese Funktion so gut wie nie brauche, ist das interessant zu wissen. Die Abfrage auf Negation liess mich auf einen bool-Rückgabewert schliessen, deshalb war ich etwas verwirrt.



  • Hauptsächlich dein char-Array durch std::string ersetzen und den Vergleich über die Vergleichsoperatoren, nicht durch stricmp, ausführen. Aber wie gesagt... Es ist kein Muss.



  • keyy.. aber findet ihr nicht das in diesem falle die strimcp funktion wirklich mehr funktionalität bietet... ich kann das was ich machen will, (der vergleich von zwei strings ohne beachtung von gross und kleinschreibung) innerhalb eines Befehls machen. Mit der von euch vorgeschlagenen Möglichkeit habe ich nicht diese "Benutzerfreundlickeit".....oder?



  • std::string kannst du in die tonne kloppen.



  • David_pb schrieb:

    Aber wie gesagt... Es ist kein Muss.

    Aber ein Soll 😉

    Vor allem langfristig wirst du froh sein, wenn du std::string nutzen kannst. Kennen musst du es früher oder später sowieso, weil es auch in einigen Bibliotheken verwendet wird.

    Jud4s schrieb:

    keyy.. aber findet ihr nicht das in diesem falle die strimcp funktion wirklich mehr funktionalität bieted... ich kann das was ich machen will (der vergleich von zwei strings ohne beachtung von gross und kleinschreibung) innerhalb eines Befehls machen, mit der von euch vorgeschlagenen Möglichkeit habe ich nicht diese "Benutzerfreundlickeit".....oder?

    Doch, du kannst es sogar noch benutzerfreundlicher mit dem Vergleichsoperator == machen:

    if (string1 == string2) // wobei string1 und string2 vom Typ std::string sind
    

    Oder willst du unbedingt eine bool-Funktion, an die du zwei Strings übergeben kannst? Die wäre ja sehr schnell selber geschrieben.

    ja schrieb:

    std::string kannst du in die tonne kloppen.

    Wieder einmal ein sehr hilfreicher Beitrag. Wenn du wenigstens Argumente hättest... 🙄



  • @Nexus:
    Es geht ihm eher um einen caseinsensitiven Vergleich. 🙂



  • bei == wird da nicht auf gross und kleinschreibung geachtet??? Ihc meine schon.... sonst nehme ich das mit Kusshand... alleine weil es sich besser und verständlicher lesen lässt.....



  • Jud4s schrieb:

    bei == wird da nicht auf gross und kleinschreibung geachtet??? Ihc meine schon.... sonst nehme ich das mit Kusshand... alleine weil es sich besser und verständlicher lesen lässt.....

    So ist es. 🙂 Aber zur Not geht ja noch:

    if ( !stricmp( axt.c_str(), "axt" ) )
    {
    }
    


  • David_pb schrieb:

    @Nexus:
    Es geht ihm eher um einen caseinsensitiven Vergleich. 🙂

    Sorry, stimmt ja. Irgendwie scheine ich heute nicht ganz bei der Sache zu sein 😉

    David_pb schrieb:

    So ist es. 🙂 Aber zur Not geht ja noch:

    if ( !stricmp( axt.c_str(), "axt" ) )
    {
    }
    

    Du solltest einfach bei Umlauten etc. aufpassen. Ich denke, die werden nicht automatisch umgewandelt bzw case-insenstive verglichen. Falls du die auch noch berücksichtigen willst, wäre eine eigene Funktion schon angebracht.
    Bei der "Axt" geht ja noch alles gut, ich wollte das einfach mal sagen; nicht dass du später deswegen Probleme bekommst.



  • thx.... dieses Problem ist gelöst..... thx @ all

    aber nun habe ich ein neues..... 😮
    und um dafür kein neues Thema aufzumachen poste ich es mal hier^^:

    diese Objekterstellung : player enemie(90,140,"Magus","Magier",1,1,8,45,false,"Ja","Schwert")
    soll diesen Konstruktor aufrufen:

    player::player(int hp, int mp ,string fn, string cc, int ccv, int AnzWa, int SchaWa, int trefwahr, bool zh, string schild, string waffe):
                   Hp                    ( hp ),
                   MaxHp                 ( mp ),
                   Mp                    ( 100 ),
                   MaxMp                 ( 100 ),
                   charclass             ( cc  ),
                   name                  ( fn  ),
                   charclassvari         ( ccv ),
                   playersown            (AnzWa,SchaWa,trefwahr,zh,schild,waffe )
    

    playersown ist wiederum eine Objekt einer Klasse ^^ mit dem Konstruktor

    weaponset::weaponset(int AnzWa, int SchaWa, int trefwahr, bool zh, string schild, string waffe):
                           AnzahlWaffen     ( AnzWa ),
                           SchadenProWaffe  ( SchaWa ), 
                           Zweihandwaffe    ( zh ),
                           treffwarscheinlichkeit ( trefwahr ),
                           schildj          ( schild ),
                           waffe            ( waffe  )
    

    nu kommt aber das Problem das der Compiler nicht erkennt das "Magus" und die ganzen anderen Zeichenketten strings sind.... er denkt das wären chars... -.- ... und ich habe keinen Blassen dunst wie ich ihm verdeutlichen soll das das strings sind.... (sind die Quellcodes von nöten oder soll ich sie der übersichtshalber wieder löschen?)

    PS: ich weiss nciht ob es verständlich war....

    playersown gehört zu Klasse weaponset
    und enemie zur Klasse player

    also playersown constructor <----- enemie.playersown.weaponset(....)



  • Er sollte dir das schon in Strings konvertieren. Du hast schon <string> inkludiert, oder? Und du hast den Namespace std auch bekannt gemacht, oder?

    Ansonsten zeig mal den Fehler her. Das ist sonst reines raten. 😉


Anmelden zum Antworten