char in *char[] kopieren oder konvertieren



  • hallo!

    Ich habe folgendes Problem

    ich habe eine adresse von einem struct char - array (versteht ihr das)

    also

    struct array
    {
    char c;
    }blub;

    nun möchte ich die chars einzeln an eine funktion übergeben...diese funktion nimmt aber nur *char an... und hier liegt mein problem...ich habe chars brauche aber *char 😃 habs schon mit

    (char*)&blub[i].c); probiert aber leider kopiert er da den ganzen Satz und nicht das element i des arrays...

    weiß jemand eine lösung wie ich an das i-te element komme? danke



  • Verstehe nicht ganz was du möchtest?
    Ist das so bunt nicht übersichtlicher?

    struct array
    {
      char c; // wie viel Zeichen, glaubst du, bekommst du hier hinein?
    }blub;
    

    MfG f.-th.



  • ja bunt ist schöner 😉

    also ich habe mehrere Methoden und eine speichert einen Satz in das oben genannte struct.

    bsp: Ich bin doof

    für i=5 würde mir blub[i].c ein b liefern. leider nur das b und nicht die Adresse des b. was ja auch klar ist, da das struct nur chars speichert.

    nun hab ich aber eine andere methode, die unbedingt *char (d.h adressen braucht an dennen die chars stehen).

    d.h

    ....
         methode(&s, (char*)&blub[i].c) /*liefert leider den ganzen Satz bis zur stelle i und nicht die stelle i selbst*/
    ....
    

    nun ist meine frage, wie ich nur eine adresse des iten chars bekomme oder wie ich es kopieren könnte um diese zu bekommen 🙄

    ich weiß kompliziert 😞



  • Das &(blub[i].c) liefert dir die Adresse des Elements c.
    Da c schon ein char ist brauchst du den cast nicht.

    Aber wofür braucht man ein Array einer struct , deren einziges Element ein char ist?



  • hmm ok also es kann auch sein, dass ich etwas falsch mache...also ich habe folgendes gemacht

    struct array *satz;
        satz = malloc(size*sizeof(char));
        file = fopen (infile, "r" );
        if (file==NULL)
        {
            fputs ("File error readfile2\n",stderr);
            exit(1);
        }
        fseek (file , 0 , SEEK_END); //Ursprung waehlen und zaehlen
        rewind (file); // "cursor" zurueck setzen
        satz[0].c = ' ';
        while ((d = fgetc(file)) != EOF)
        {
        	satz[i].c = d; 
        	i++;
        }
        fclose (file);
    
        return satz;
    }
    

    um eine datei ein zu lesen und diese als "array" ab zu speichern...vllt speichere ich einfach falsch ab?



  • OMG 😮

    Mach einfach statt struct array *satz; ein char *satz;
    Lass das .c weg.

    Das fseek und rewind brauchst duauchnicht, ist schon mit fopen(...,"r") gemacht.

    Die Überprüfung auf i >= size fehlt noch.

    Kapitel über Arrays und Strings nochmal lesen



  • anstelle eines OMG könntest du mir vielleicht sagen, was genau an dem Konstrukt falsch ist. Danke



  • Steht doch da.

    Nimm ein einfaches Array von char
    Bzw lass satz ein Zeiger auf char sein.

    Du machst das viel zu kompliziert.

    Und noch (mehrere) mal die C Grundlagen durchlesen.



  • hab es jetzt abgeändert und die methode liefert immer noch nicht die stelle i sondern die zeichen bis zur stelle i



  • Das hängt davon ab, was deine methode mit der Angabe von deinem char * macht.
    char * werden in C (auch) für Zeichenketten benutzt.



  • also ich hab einen stack implementiert und der soll meiner vorstellung nach nur ein char auf den "stack pushen...

    [cpp]
    struct stackelement
    {
    struct stackelement *previous;
    char *zeichen;
    };

    ...

    void Push(struct stack *s, char *ptr)
    {
    struct stackelement nse;
    nse = (struct stackelement
    )malloc(sizeof(struct stackelement));
    nse->previous = s->top;
    nse->zeichen = ptr;
    s->top = nse;
    }



  • sorry hier nochmal in schön

    struct stackelement
    {
    	struct stackelement *previous;
    	char *zeichen;
    };
    
    ...
    
    void Push(struct stack *s, char *ptr)
    {
    	struct stackelement *nse;
    	nse = (struct stackelement*)malloc(sizeof(struct stackelement));
    	nse->previous = s->top;
    	nse->zeichen = ptr;
    	s->top = nse;
    }
    


  • sorry natürlich ich arbeite die ganze zeit mit adressen und nicht mit chars...habs geändert und es funktioniert jetzt...danke fürs Kopf rütteln 😉


Log in to reply