kopieren von strings und pointern



  • Hi,
    ich habe eine Funktion, die mir einen char* zurückgibt.
    Diesen möchte ich in einer Variable speichern, dabei habe ich aber das Problem, daß der Wert später überschrieben wird, obwohl ich das nicht will.

    char *Typ=(char*)ReadStringEntry();
    char *surf=(char*)ReadStringEntry();
    char *curv=(char*)ReadStringEntry();
    double s1=ReadDoubleEntry();
    double s2=ReadDoubleEntry();
    int np=ReadIntegerEntry();
    double *parp=(double*)malloc((np+1)*sizeof(double));
    for(i=0; i<np+1; i++)
    {
      parp[i]=ReadDoubleEntry();
    }
    

    Beim durchlaufen der Schleife, werden die Elemente Typ, surf, curv überschrieben. Ich habe keine Ahnung warum.

    Die Funktionen Read**** lifern immer einen pointer oder bei Zahlen den betreffenden Typ zurück.



  • Liefern denn die ReadStringEntity-Funktionen auch Zeiger auf frisch allozierten Speicher? Zeig diese Funktion mal.



  • LPCTSTR Reg321::ReadStringEntry()
    {
    	char komma[]=" /=";
    	m_cToken = strtok( NULL, komma );
    	if(strstr(m_cToken,"*"))//(m_cToken==NULL)
    	{
    		fgets(m_cLineBuf, BUFSIZE, m_fileVDA);	
    		CopyLine();
    		m_cToken = strtok( m_cLine, komma );
    	}
    	return m_cToken;
    }
    


  • Das Verhalten dieser Funktion kann man nicht ohne die Vorgeschichte verstehen. Du rufst strtok mit NULL als Argument auf, d.h. es muss schon einen vorhergehenden Aufruf von strtok gegeben haben.
    BTW es könnte sein, dass du mit strpbrk besser beraten wärst.



  • Ich habe es jetzt so gelöst.

    const char *_holder=ReadStringEntry();
    char Typ[]="leer";
    strcpy(Typ,_holder);
    

    Mir gefällt es nicht so sehr, daher eine neue Frage, wie geht das schöner.
    An den Funktionen Read***** kann ich nichts ändern, da die in anderen Programmteilen genau das machen was sie sollen und ich damit nichts zu tun habe. 😞



  • was machst du wenn der von ReadStringEntity zurückgegebene String länger als 4 Zeichen ist? Du wirst nicht um dynamische Speicherallokation herumkommen.



  • Stimmt, 😞
    strcpy funzt aber nicht bei:

    const char *_holder=ReadStringEntry();
    char *Typ;
    strcpy(Typ,_holder);
    

    😡



  • Klar, das ist ja auch nirgends was von dynamischer Allokation zu sehen.
    Stichwort new ...

    Wieso mühst du dich eigentlich mit char-Pointern ab wenn es strings gibt?



  • Mal ne wirklich dumme Frage:
    wie konvertiere ich von char nach string?

    Und es gibt da ein kleines Problem, es ist nicht mein Programm, ich soll es nur umbauen und neue Funktionen einfügen, aber das alte Programm weitgehenst erhalten.



  • daishi schrieb:

    Mal ne wirklich dumme Frage:
    wie konvertiere ich von char nach string?

    std::string hat einen passenden Konstruktor.

    string typ(ReadStringEntity());
    

    fertig.

    Und es gibt da ein kleines Problem, es ist nicht mein Programm, ich soll es nur umbauen und neue Funktionen einfügen, aber das alte Programm weitgehenst erhalten.

    Wenn du die Standardbibliothek ausschließt, gibts kein Patentrezept. Du wirst dich eingehend mit Zeigern und Speicherreservierung beschäftigen müssen. Da führt kein Weg dran vorbei.



  • Is doch logisch, dass das nicht funktioniert, Typ zeigt ja nicht auf einen
    gueltigen Speicherbereich.

    Musst fuer Typ erst Speicher reservieren.

    mfg
    v R



  • Ok, danke.
    Ich werde es jetzt mal mit nem string versuchen.
    Im Notfall kommt ne neue Klasse dazu, in der die Funktionen halt ein zweites mal, nur hat umgebaut, drinliegen.


Anmelden zum Antworten