wie kann ich den Inhalt eines Pointers zu nem Array zuweisen



  • Hallo Leute! 😋
    meine Frage ist wie kann ich den Inhalt eines Zeigers in einem Array speicheren.
    vielen Dank im voraus 😉

    ...
    char* Pt1;
    char array [];
    ...
    
    Pt1 = strtok("string1_string2_string3_...","_");
    array = Pt1; //Fehler!!! wie löse ich es dann??? :open_mouth:  :rolling_eyes: 
    ...
    


  • Das ist C, ich verschiebe dich mal. 🙂



  • Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ...
    char* Pt1;
    char array [];
    ...
    
    Pt1 = strtok("string1_string2_string3_...","_");
    array = Pt1; //Fehler!!! wie löse ich es dann??? :open_mouth:  :rolling_eyes: 
    ...
    

    [/quote]

    ich denke so sollte es funktionieren:

    .......
    char* Ptl;
    .......
    
    Ptl = new char[100];
    

    durch das new legst du ein array während der Laufzeit an. ab dann kannst du über den zeiger auf das array zugreifen. wenn du nicht vorher weist wie groß dein array wird, kannst du auch die klasse CArray nutzen. in dieser klasse findest du dynamische arrays.



  • abdel schrieb:

    Hallo Leute! 😋
    meine Frage ist wie kann ich den Inhalt eines Zeigers in einem Array speicheren.

    Indem du die Werte, auf die der Pointer zeigt, in dieses Array kopierst.

    ...
    char* Pt1;
    char array []; // sowas gibts nicht, eine Arraydefinition muss eine Größe enthalten
    ...
    
    Pt1 = strtok("string1_string2_string3_...","_");
    array = Pt1; //Fehler!!! wie löse ich es dann??? :open_mouth:  :rolling_eyes: 
    ...
    
    strcpy(array, Pt1);
    

    Das ist allerdings nicht zu empfehlen, da es zu einem Bufferoverflow führen kann. Warum muss es unbedingt ein festes Array sein?



  • Bashar schrieb:

    strcpy(array, Pt1);
    

    Auauau, wenn das mal kein undefiniertes Verhalten ergibt.

    1. Wie Bashar schon schrieb, kannst du ein array nicht ohne groesse deklarieren. Also muss zwischen deine [] eine Zahl.
    2. strcpy geht zwar bei strings, bei fester Arraygroesse ist aber strncpy oder memcpy zu empfehlen
    3. Ich nehm mal an, deinem Beispiel nach, willst du sowas wie nen Parser bauen. Dann schmeiss die Idee mit dem Array ueber den Haufen und nimm statt dessen einen Pointer dem du die stelle im String zuweist und ggf noch eine Integervariable in der die laenge des substrings steht.



  • pli schrieb:

    1. Wie Bashar schon schrieb, kannst du ein array nicht ohne groesse deklarieren. Also muss zwischen deine [] eine Zahl.

    Allerdings nur, wenn das Array nicht explizit initialisiert wird.



  • abdel schrieb:

    Hallo Leute! 😋
    meine Frage ist wie kann ich den Inhalt eines Zeigers in einem Array speicheren.
    vielen Dank im voraus 😉

    ...
    char* Pt1;
    char array [];
    ...
    
    Pt1 = strtok("string1_string2_string3_...","_");
    array = Pt1; //Fehler!!! wie löse ich es dann??? :open_mouth:  :rolling_eyes: 
    ...
    
    Würde das so nicht auch gehen?...
    char* Pt1;
    Pt1 = strtok("string1_string2_string3_...","_");
    int i,n=strlen(Pt1);
    char array[n];
    
    for(i=0;i<n+1;i++)
    {
    array[i]=Pt1[i];
    } 
    printf("%s",array);
    


  • Theoretisch schon aber ältere Compiler können damit nicht umgehen wegen dem char array[n]; da sowas erst ab C99 gütig ist.

    Außerdem kannst strcpy statt die ganze for-Schleife benutzen.

    Die beste Lösung wäre:

    char* Ptl, *string;
    
    Pt1 = strtok("string1_string2_string3_...","_");
    
    string = malloc(strlen(Ptl)+1);
    
    if(!string)
    {
        fprintf(stderr, "Kein Speicher mehr!\n");
        /* hier Fehlerbehandlung */
    }
    
    strcpy(string, Ptl);
    
    ....
    free(string);
    


  • supertux schrieb:

    Theoretisch schon aber ältere Compiler können damit nicht umgehen wegen dem char array[n]; da sowas erst ab C99 gütig ist.

    Außerdem kannst strcpy statt die ganze for-Schleife benutzen.

    Die beste Lösung wäre:

    char* Ptl, *string;
    
    Pt1 = strtok("string1_string2_string3_...","_");
    
    string = malloc(strlen(Ptl)+1);
    
    if(!string)
    {
        fprintf(stderr, "Kein Speicher mehr!\n");
        /* hier Fehlerbehandlung */
    }
    
    strcpy(string, Ptl);
    
    ....
    free(string);
    

    Das ist natürlich eine feine Sache den Speicher dynamisch für das Array zu belegen,aber 1.glaube ich nicht das heute noch einer c99 standart benutzt,und
    2.wär mir das für ein so kleines Programm zu aufwendig.Für größere Sachen ist
    deine Lösung die bessere Wahl....
    MfG
    Ciro



  • Ich verstehe nicht, was du meinst (das mit dem Standard).

    Sowas wie char array[n]; mit n als Variable ist erst nach C99 im Standard (wenn ich mich nicht irre), d.h. wenn du nicht nach C99 kompilierst, dann kann das unter Umständen gar nicht kompiliert werden.



  • supertux schrieb:

    Außerdem kannst strcpy statt die ganze for-Schleife benutzen.

    Die beste Lösung wäre:

    char* Ptl, *string;
    
    Pt1 = strtok("string1_string2_string3_...","_");
    
    string = malloc(strlen(Ptl)+1);
    
    if(!string)
    {
        fprintf(stderr, "Kein Speicher mehr!\n");
        /* hier Fehlerbehandlung */
    }
    
    strcpy(string, Ptl);
    
    ....
    free(string);
    

    Sollte man dann nicht gleich strdup() nehmen? 😉



  • ja, ich vergesse immer diese Funktion 🙂



  • supertux schrieb:

    Ich verstehe nicht, was du meinst (das mit dem Standard).

    Sowas wie char array[n]; mit n als Variable ist erst nach C99 im Standard (wenn ich mich nicht irre), d.h. wenn du nicht nach C99 kompilierst, dann kann das unter Umständen gar nicht kompiliert werden.

    Sorry!Ich hab mich falsch augedrück...Ich meinte das heute der größte Teil nach C99 Standard compiliert.Du etwa nicht?



  • Ich schon, aber voraussetzen kann man nicht. Es gibt noch Leute, die mit (ur)alten Compilern kompilieren.



  • supertux schrieb:

    ja, ich vergesse immer diese Funktion 🙂

    Du bist da in guter Gesellschaft, die Leute vom Normierungskommitee haben die Funktion auch vergessen.



  • Daniel E. schrieb:

    supertux schrieb:

    ja, ich vergesse immer diese Funktion 🙂

    Du bist da in guter Gesellschaft, die Leute vom Normierungskommitee haben die Funktion auch vergessen.

    Das ist allerdings wahr.


Anmelden zum Antworten