string-Array kopieren?



  • Hallo,

    ich will einfach den Inhalt eines string-Array einem anderen string-Array zuweisen. Folgender Code soll das verdeutlichen:

    int main(void) {
       int i;
       char namen[4][80]={"London","Berlin","Paris","Athen"};
       char **namenneu;
       char buf[80];
    
       /*Speicher fuer namenneu reservieren */ 
       namenneu=(char **)malloc(80*4);
       for (i=0;i<4;i++) {
    	   printf("%s\n",namen[i]);
    	   strcpy(buf,namen[i]);
    //	   namenneu[i]=namen[i]; //Das funktioniert
    	   namenneu[i]=buf;   // namenneu[i] hat immer den letzten zugewiesen Wert im buf
    	   printf("%s\n",buf);
    	}
       for (i=0;i<4;i++) printf("%s\n",namenneu[i]);	   
    }
    

    In der Ausgabe sehe ich immer den letzten string, den buf bekommen hat, nämlich "Athen". Warum ist das so? Wie kann man das umgehen? Wenn ich folgende Anweisung benutze

    namenneu[i]=namen[i];
    

    bekomme ich das was ich will. Das Problem ist, daß ich in meiner Anwendung die ursprünglichen strings verändern will, daher der Weg über buf.

    Ich bin für jeden Tipp sehr dankbar!

    Gruß,
    Emmanuel





  • Ist das ein Problem der Speicherreservierung? Ich hatte auch folgendes probiert, das geschilderte Problem bestand aber weiterhin:

    //Zeilen
    namenneu=(char **)malloc(4);
    //Spalten
    for(i = 0; i < 4; i++) namenneu[i] = (char *)malloc(80);
    

    Noch ein weiterer Tipp?

    Emmanuel



  • Das sieht schon besser aus (bis auf die Casts und die fehlenden Checks von malloc() (was ich auch mal gerne unterschlage ;))). Zeig doch mal diese Variante komplett. Hast das sinngemäß so gemacht?

    strcpy(namenneu[i], namen[i]);
    


  • Bei dieser Variante schreibe ich direkt:

    namenneu[i]=namen[i];
    

    was sehr gut funktioniert. Grad eben auch Deine Variante probiert:

    strcpy(namenneu[i],namen[i]);
    

    welche auch gut funktioniert.

    Wenn ich aber schreibe:

    strcpy(buf,namen[i]);
    namenneu[i]=buf;
    

    bekomme ich für alle 4 Zeilen des namenneu den gleichen Wert "Athen". Warum ist das so?

    Jetzt habe ich gefunden, was ich schreiben soll, damit es geht:

    strcpy(buf,namen[i]);
    buf[4]='\0'; // stellvertrettend für irgendeine Änderung
    strcpy(namenneu[i],buf);
    

    Jetzt hat namenneu in jeder Zeile den geänderten String! Trotzdem bleibt für mich die Frage, warum das mit der direkten Zuweisung namenneu[i]=buf; zu einem anderen Ergebnis führt!

    Auf jeden Fall, danke für die Hilfe.

    Emmanuel



  • hi,
    du kannst dir auch vom compiler helfen lassen bei solchen kopien 😉

    #include <stdio.h>
    
    typedef struct __strings
    {
    	char namen[4][80];
    } strings;
    
    void main (void)
    {
        // das original
        strings s = {"London","Berlin","Paris","Athen"};
    
        // die kopie
        strings copy = s;
    
        // test
        {
            int s;
            for (s=0; s<4; s++)
                printf ("%s\n", copy.namen[s]);
        }
    }
    


  • emmanuel schrieb:

    Noch ein weiterer Tipp?

    Ja, achte mal darauf, welche Größe du an malloc übergibst ( malloc(4) liefert 4 Byte Heap-Speicher, das reicht normalerweise für einen char*).

    Trotzdem bleibt für mich die Frage, warum das mit der direkten Zuweisung namenneu[i]=buf; zu einem anderen Ergebnis führt!

    Weil die direkte Zuweisung nur den Zeiger umbiegt (flache Kopie) und nicht die Daten hinter dem Zeiger kopiert (tiefe Kopie) - für letzteres gibt es je nach Anwendungsbereich strcpy(), strncpy(), memcpy(), memmove() oder auch die Möglichkeit, die Daten von Hand zu kopieren.


Anmelden zum Antworten