string array kopieren



  • hallo, um string zu kopieren gibts ja:

    strncpy(ziel,quelle)

    ich habe hier ein string array: stringarray[8][20]

    wie kopiere ich das in ein anderes stringarray der selben länge?

    also ich meine ich würds schon hinkriegen mit einzelnen string-copies etc, aber gibt es dafür auch schon eine vordefinierte funktion?

    danke



  • Du könntest memcpy verwenden. Das *sollte* eigentlich funktionieren.



  • okay, wollte das testen, komme aber nicht soweit, da schon vorher ein problem aufritt.

    ich mache nämlich:

    memcpy(names,getNames());
    

    getNames ist eine Funktion mit folgender signatur:

    char** getNames(void);
    

    ich bekomme allerdings schon innerhalb dieser funktion eine warnung, ich versteh nur nicht warum:

    char** getNames(void){
    
    char allNames[8][20];
    
    // hier speichere ich namen ich die einzelnen strings von allNames...
    
    return allNames;}
    

    beim compilen die warnung:

    warning: return from incompatible pointer type
    

    die funktion soll doch als rückgabe wer ein char** haben, und genau das ist doch allNames, oder nicht?



  • nein, allNames ist ein char[...][...]-array, kein char**. das passt nicht.
    ausserdem versuchst du die adresse eines lokalen objekts zurückzugeben, was sowieso nicht hinhaut. kommt drauf am was du vorhast, aber vielleicht könntest du z.b. das feld 'static' machen und den rückegabewert in einen einfachen char* casten.
    🙂



  • hey,
    also dass ichs lokal übergeb stimmt, krieg da auch ne warnung :p

    aber es geht. denke ich.
    also ich krieg fehler, denke aber im moment eher das liegt an memcpy, nicht daran dass ich's lokal übergeb.

    ich brauch das übrigens danach gar nicht mehr, von daher is mir wurscht ob ich jetzt nur ne kopie krieg, oder was das lokal auch sonst so bedeutet :p

    naja, zumindet krieg ich aber jetzt fehler:

    memcpy(name,getNames(),400);
    

    ich muss sagen die 400 sind aus den fingern gezogen, ich versteh nich so ganz was ich da genau eingeben sollte für ne zahl :p

    der fehler ist folgender:

    lasse ich mir nun die einzelnen strings von 'name' printen, kommt folgendes:

    1. EMPTY          5. `s>�� (��8k��
                        2. EMPTY          6.               
                        3. EMTPY          7. ��Bٷ����
                        4. EMPT�������D�h&��`s>�� (��8k��8. 8���`���Ԏ�����߷h&
    

    zur erklärung: es sollte eigentlich in jedem string des arrays 'name' das wort EMPTY stehen. wie man sieht, gehen die ersten 3 strings im array noch perfekt.
    irgendwann schiesst er mir dann solche zeichen rein.
    wenn ich in der getNames()-Funktion vor dem returnen überprüfe, was da drin steht, ist es ganz sauber für jeder name "EMPTY".

    d.h. der fehler passiert irgendwo in der mempcy, vllt. sogar wirklich wegen dieser lokalitäts-warnung oder keine ahnung... ideas?

    ps: ich dachte char** ist das selbe wie char[][] ??
    wo ist denn der unterschied? ich dachte jedes array ist ein pointer (auf die anfangsadresse dieses arrays)

    wie kann ich das dann richtig returnen? das mit dem static kenn ich nicht, was is daS?



  • hdi schrieb:

    ps: ich dachte char** ist das selbe wie char[][] ??
    wo ist denn der unterschied? ich dachte jedes array ist ein pointer (auf die anfangsadresse dieses arrays)

    nö, ein

    char** a;
    

    kann zwar auf einen

    char *b[...];
    

    aber nicht auf einen

    char c[...][...];
    

    . mit typedefs kann man was machen (weiss nicht ob's auch direkt geht):

    typedef char FIELD_2D[10][10];
    ...
    FIELD_2D f;        // ein 10*10 feld
    FIELD_2D *p = &f;  // zeiger darauf mit der adresse des felds initialisiert
    

    🙂



  • zum verständnis:

    ein char* b[] kann aber auf ein char c[][] zugreifen, oder?
    daher dein tipp, das zu casten oder?

    und das mit den typedefs check ich nich so ganz.

    FIELD_2D f;

    ist doch dann das selbe wie:

    char f[10][10]

    oder?

    was sollte daran einne unterschied machen, ausser dass es komplizierter geworden ist?

    ich weiss nicht genau, worauf du hinaus willst.



  • hdi schrieb:

    ein char* b[] kann aber auf ein char c[][] zugreifen, oder?

    nee, das erste ist ein array von char-pointern und das andere ein 2d-char-array. die haben nicht viel gemeinsam.

    hdi schrieb:

    daher dein tipp, das zu casten oder?

    du kannst auf ein char[][] mit einem einfachen char* zeigen, brauchst aber einen cast dafür.

    hdi schrieb:

    und das mit den typedefs check ich nich so ganz.

    das ist dafür da, damit man nicht casten braucht, also man einen pointer auf ein 2d-array des passenden typs definieren kann. ob es auch ohne typedef geht weiss ich aber nicht.


Anmelden zum Antworten