strcpy verursacht Programmabsturz // Benutze eine char*



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



  • Der Parametertyp ist eindeutig (du verwendest ja nur einen Konstruktor, oder?), es gibt keinen Grund dazu, "Magus" und die anderen Zeichenketten als Char-Arrays zu erkennen. Wieso meinst du, sie werden so erkannt? Könntest du vielleicht die Fehlermeldung posten?

    Im Notfall übergibst du eben z.B. string("Magnus") statt "Magnus" . Doch ich denke, der Fehler liegt woanders.



  • Fehlermeldung -> no matching function for call to `player::player(int, int, const char[6], const char[7], int, int, int, int, bool, const char[3], const char[8])'

    canidates are: player::player(std::string, std::string, int, int, int, int, bool, std::string, std::string)

    das ist die Fehlermeldung... sprich er erkennt die strings als chars und fnidest somit den constructor nicht....



  • Ich würde sagen, dass der Fehler immernoch wo anderst liegt.

    canidates are: player::player(std::string, std::string, int, int, int, int, bool, std::string, std::string)
    

    Macht für mich keinen Sinn, da du ja (int, int .. ) am Anfang hast.. Zeig mal den genauen Aufruf und die Deklaration.



  • ohh mann.. schande bin ich bräsig... das ist der Fehler es funktioniert nun.... vielne Dank^^


Anmelden zum Antworten