Frage zu strcat



  • In C++ reicht sogar folgendes:

    char x[80] = { };
    


  • blurry333 schrieb:

    int main()
    {
    char x[80];
    char* y="Welt";
    char* p="Hallo";
    strcat(x,p);
    strcat(x,y);
    
    cout<<x;
    }
    

    Dieser Code führt zu einem Problem. Warum ?

    Die Begründung wurde ja schon genannt. Bessere Lösung ist aber

    int main()
    {
    char x[80];
    char* y="Welt";
    char* p="Hallo";
    strcpy(x,p);
    strcat(x,y);
    
    cout<<x;
    }
    

    strcpy erwartet kein initialisiertes char array.

    mfg Martin



  • Jetz bin ich aber enttäuscht von der "besseren" Lösung.
    Wie wärs mit std::string?

    Simon



  • theta schrieb:

    Jetz bin ich aber enttäuscht von der "besseren" Lösung.
    Wie wärs mit std::string?

    Simon

    Das wäre aber Themaverfehlung, es ging dem Threadstarter um strcat. Ansonsten hast Du natürlich recht. Das ist i.d.R. noch besser.

    mfg Martin



  • Wenn´s denn unbeding C sein muss würde ich eher strncpy und strncat benutzen.



  • DocShoe schrieb:

    Wenn´s denn unbeding C sein muss würde ich eher strncpy und strncat benutzen.

    Ich denke weniger, dass ein Code mit cout<<x; C sein muss. Wahrscheinlich sind blurry333 lediglich die Vorteile von std::string gegenüber C-Strings noch nicht ganz bewusst.



  • Nexus schrieb:

    ... Wahrscheinlich sind blurry333 lediglich die Vorteile von std::string gegenüber C-Strings noch nicht ganz bewusst.

    Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).
    Ist wieder ein Thema für Dogmatiker! :p



  • berniebutt schrieb:

    Nexus schrieb:

    ... Wahrscheinlich sind blurry333 lediglich die Vorteile von std::string gegenüber C-Strings noch nicht ganz bewusst.

    Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).
    Ist wieder ein Thema für Dogmatiker! :p

    Falsch. Es geht hier nicht um eine konkrete Anwendung sondern um eine Übung. Es ist nicht verkehrt, auch solche Klassen wie std:string zu betrachten um dann, wenn es um eine konkrete Anwendung geht, souverän entscheiden zu können, was Sinn macht. Wenn ich bei Übungen nur strcpy und co anschaue, werde ich nie lernen, std:string einzusetzen auch, wenn es besser wäre.

    mfg Martin



  • berniebutt schrieb:

    Nexus schrieb:

    ... Wahrscheinlich sind blurry333 lediglich die Vorteile von std::string gegenüber C-Strings noch nicht ganz bewusst.

    Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).
    Ist wieder ein Thema für Dogmatiker! :p

    Ich schon. Du reservierst 80 Zeichen, wo du nur 10 brauchst. Immerhin eine Verschwendung von 700%. Und deine Definition auf char c[10] zu ändern, hilft nur sehr bedingt, denn sobald (wie fast immer) die Inhalte dynamisch werden (Usereingabe, Auslesen aus Datei etc.) kommt immer entweder der Fall vor, dass du zu wenig Platz hast und im schlimmsten Fall Pufferüberläufe provozierst, oder zu viel und damit Speicherverschwendung. Mit std::string hast du diese ganzen Probleme nicht.
    Vergleiche darüber hinaus auch die Lesbarkeit:

    char x[10];
    strcpy(x, "Hallo");
    strcat(x, "Welt");
    
    // vs
    
    std::string x = "Hallo";
    x += "Welt";
    


  • berniebutt schrieb:

    Nexus schrieb:

    ... Wahrscheinlich sind blurry333 lediglich die Vorteile von std::string gegenüber C-Strings noch nicht ganz bewusst.

    Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).
    Ist wieder ein Thema für Dogmatiker! :p

    Nein, sondern für Leute, die keine abstürzenden Programme haben wollen 😉

    int main()
    {
      char x[8];
      char* y="Welt";
      char* p="Hallo";
      strcpy(x,p);
      strcat(x,y);
    
      cout<<x;
    }
    

    wird sicher zum Problem (wer findet den Fehler).

    int main()
    {
      std::string y( "Welt" );
      std::string p( "Hallo" );
      std::string x = p + y;
    
      cout<<x;
    }
    

    geht einfach.

    Lars



  • berniebutt schrieb:

    Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).
    Ist wieder ein Thema für Dogmatiker! :p

    Vom "Die ewig Gestrigen e.V." habe ich schon mal was gehört.
    Kann man deinem Verein beitreten? 🤡



  • Artchi schrieb:

    Vom "Die ewig Gestrigen e.V." habe ich schon mal was gehört. Kann man deinem Verein beitreten? 🤡

    Lass gut sein, auch ohne Verein. Die Smileys sind doch dazu da, mal etwas provokativ ausdrücken zu dürfen! :p Klar, schätze ich die Neuerungen von C++ gegenüber dem vorherigen C sehr und setze diese auch ein. Nur, wenn ich einzelne Strings bekannter Länge habe, die einmal initiert werden (z.B. AppName), dann mache ich das weiter mit einem C-String. Als nun mal fauler Mensch, wähle ich stets den einfachsten, kürzesten, und sichersten Weg.
    Ich habe allein etwas gegen die hier oft geäusserte Meinung: "Das macht man heute nicht mehr so, ist kein C++, sondern veraltetes C!"



  • berniebutt schrieb:

    Als nun mal fauler Mensch, wähle ich stets den einfachsten, kürzesten, und sichersten Weg.

    berniebutt schrieb:

    Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).

    Die beiden Aussagen passen nicht zusammen. string c = a + b; ist zweifellos einfacher, kürzer und sicherer als char c[wievieleigentlich?]; strcpy(c, a); strcat(c, b); .



  • berniebutt schrieb:

    Ich habe allein etwas gegen die hier oft geäusserte Meinung: "Das macht man heute nicht mehr so, ist kein C++, sondern veraltetes C!"

    Und aus reinem Trotz nimmst du also doch die veraltete Lösung mit mehr Nachteilen?

    Ist ja nicht so, dass C-Strings immer die schlechtere Wahl sind. Z.B. für Literale nehme ich auch meist const char* . Aber sobald etwas mehr Operationen im Spiel sind, macht man sich das Leben mit std::string um einiges leichter.



  • blurry333 schrieb:

    [...]Dieser Code führt zu einem Problem. Warum ?

    berniebutt schrieb:

    [...]Ich sehe in diesem einfachen Beispiel keine Vorteile von C++ (std::string) gegenüber C (strcpy, strcat).
    Ist wieder ein Thema für Dogmatiker! :p

    Tja...


Anmelden zum Antworten