char kopieren



  • Hallo, wie kann ich ein char in ein anderes char kopieren?

    Beispiel:

    char str[] = "abcd";
    char str2[] = str; //das läuft nicht
    char str2[strlen(str)]; //läuft auch nicht, es wird immer ein konstanter Ausdruck erwartet
    

    Danke für eine Antwort,
    Ingo



  • Das geht mit strcpy().



  • Hallo,
    leider lässt sich "strcpy(str2, str)" nicht compilieren, da ich str2 noch gar nicht deklariert habe, denn "str2[strlen(str)]" klappt nicht.
    Ich könnte schreiben:
    char str2[5];
    strcpy (str2, str);
    Aber ich will die 5 da nicht haben, sondern str2 soll relativ zur Größe von str erstellt werden.



  • #include <stdlib.h>
    /* ... */
    char* str2 = malloc (strlen (str) + 1);
    if (!str2) {
      /* Problem: Kein Speicher mehr verfügbar! */
    }
    /* Zeugs */
    free (str2);
    


  • Ein kurzes Beispiel:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char s1[] = "Hallo Welt";
        char s2[100];      /* Auf ausreichend Platz achten ... */
    
        strcpy(s2, s1);    /* s1 nach s2 kopieren */
        puts(s2);
    
        return 0;
    }
    


  • Danke für die Antwort,
    ich hatte nur <seufz> gehofft, dass ich ohne dynamische Speicherallozierung und nur mit Hilfe der Standardfunktionen auskomme.



  • Eigentlich sollte das auch so ähnlich gehen, wie in deiner Frage (Der Speicherbereich war um 1 zu klein), aber dann brauchst Du einen Compiler, der C99 (zumindest teilweise) unterstützt, oder einer solche Erweiterung anbietet.



  • Hallo Mady,
    dein Posting hat sich mit meiner Antwort überschnitten.
    Zu deiner Antwort. Schau dir mal bitte das an:

    void func(char *str)
    {
        char str2[100] = "";
        strcpy(str2, str);
    }
    
    void main(void)
    {
        char str[] = "abcd";
        func(str);
    }
    

    func weiß aber nicht, wie groß str ist. Wenn str zu groß ist, knallt es. Daher muss ich die Größe von str kennen.
    Die Antwort von Daniel E. behebt das Problem, ich hatte aber, wie gesagt, gehofft, dass ich ohne Speicheranforderung auskomme...



  • Original erstellt von <Ingo>:
    [...]func weiß aber nicht, wie groß str ist. Wenn str zu groß ist, knallt es. Daher muss ich die Größe von str kennen.
    Die Antwort von Daniel E. behebt das Problem, ich hatte aber, wie gesagt, gehofft, dass ich ohne Speicheranforderung auskomme...

    Dann überprüfe doch einfach die Länge von str in einer if-Konstruktion.
    Ich meine so á la :

    if( LaengeVon_str > AlsDieMaximaleLaenge )
    {
       /*--- abbrechen ---*/
    }
    
    else
    {
       /*--- kopieren doch einfach mal ;) ---*/
    }
    

    Kannst ja diese Konstruktion noch mit einem Rückgabewert versehen, ob das kopieren erfolgreich war:

    int func( char str[] )
    {
       if( LaengeVon_str > AlsDieMaximaleLaenge )
       {
          /*--- abbrechen ---*/
          return -1; /*--- ist halt schiefgelaufen, weil Feld zu groß ---*/
       }
    
       else
       {
          /*--- kopieren doch einfach mal ;) ---*/
          return 0; /*--- erfolgreich kopiert, @mady: siehste, sogar ohne Klammern ;) ---*/
       }
    }
    
    int main()
    {
       if( func( Parameter ) == 0 )
       {
          /*--- was weiß ich :) ---*/
       }
    
       return 0;
    }
    


  • Ich könnte mir auch vorstellen das man das über ein #define lösen könnte.

    zB.

    #define MAX_STRING 255
    
    int main(int argc, char *argv[])
    {
      char str1[MAX_STRING] = "hello";
      char str2[MAX_STRING];
    
      strcpy(str2, str1);
    
      printf("%s || %s\n", str2, str1);
    
      return 0;
    }
    

    oder auch über pointer:

    char str1[] = "hello";
    char *str2;
    
    str2 = &str1[0];
    


  • #define MAX_LAENGE 100
    int main(void)
    {
        char s1[] = "Hallo Welt";
        char s2[MAX_LAENGE];      /* 100 Zeichen */
    
        strncpy(s2, s1, MAX_LAENGE-1); /* s1 nach s2 kopieren , aber max. 99 Zeichen!!! */
        return 0;
    }
    

    Ich verwende eigentlich immer strNcpy ... und wenn die Länge des Zielbuffers
    unbekannt ist dynamisch..
    http://www.rt.com/man/strcpy.3.html

    @<sg> "#define" ist nur ein Werkzeug.. keine Lösung... und die untere "Lösung"
    kopiert kein String, sondern zeigt nur auf diesen... und ist überflüssig lang
    geschrieben "str2 = str1;" = "str2 = &str1[0];"
    (Die Adresse des ersten Objekts steht sowieso in "str1")

    edit : "-1" wäre nicht schlecht 😉

    [ Dieser Beitrag wurde am 13.01.2003 um 16:43 Uhr von Solaris'dUKe editiert. ]



  • Das Größenproblem könnte man so lösen

    #include <string.h>
    ...
    /* ich tu's in eine Funktion, damit str und str2 die Speicherklasse auto haben */
    void foo() {
      char str[] = "Hello world und ausserdem bin ich zu faul die Groesse dieses Strings von Hand auszuzaehlen ;)";
      char str2[sizeof(str)];
      strcpy(str2,str);
      /* ... */
    }
    

    es klappt übrigens auch mit C89, da sizeof einen konstanten Ausdruck liefert.

    Um das Kopieren kommst du IMHO nicht herum (wird bei der Initialisierung von auto-Arrays eh gemacht)

    BTW: Falls du beide Arrays nicht unabhängig voneinander verändern willst, kannst du auch str2 einfach einen Zeiger auf str sein lassen ...

    nochmal: sizeof ist nicht das gleiche wie strlen - Anfänger bringen da gerne was durcheinander. Lass dir gut durch den Kopf gehen was hier passiert und warum es richtig ist (und evtl. wo es nicht richtig wäre).



  • @Bashar:
    DAS war genau das, was ich haben wollte. Vielen Dank für die Hilfe!!!

    Ingo


Anmelden zum Antworten