problem mit char* und char



  • Hallo zusammen,
    ich verwende die Funktion

    char *token;
    token=strtok(buf, " \t\n,");
    

    Im verlaufe meines scripts verändert sich buf, und damit auch der wert von token, oder? Wie kann ichs hinbekommen, dass der Werte in token fix ist und nicht mehr vom Inhalt in buf abhängt? Irgendeine möglichkeit mit strings oder strcpy?
    Vielen Dank schon mal!



  • ???!???

    Ist strtok eine Funktion von dir?

    char *token;
    token=strtok(buf, " \t\n,");
    

    Sowas ist normalerweise nicht üblich, weil nicht definiert ist wieviel Speicher für token reserviert worden ist (Man überschreibt nur ungerne nicht reservierten Speicher...). Daher wird bei solchen Funktionen normalerweise ein Buffer verwendet der als Parameter übergeben wird. In diesen werden dann die Zeichenkette geschrieben. Ein weiterer Parameter sollte die Größe des Puffers sein.
    Der Rückgabewert solcher Funktionen gibt meistens an ob die Buffergröße ausgereicht hat.



  • Mathias schrieb:

    Ist strtok eine Funktion von dir?

    Nein, die gibts schon fertig:

    Routine strtok
    Required Header <string.h>
    Compatibility ANSI, Win 95, Win NT

    Und das ist so schon üblich, da token nur auf eine bestimmte Stelle im schon vorhandenen String zeigen muß.



  • Nein, man: strtok ist eine Funktion der C-Standardbibliothek. Und der liefert tatsächlich nur Zeiger in deinen übergebenen Pufferbereich - wenn du diese Daten beibehalten willst, mußt du sie mit strcpy() kopieren.

    (Alternativ mit Strings: Such mittels find_first_of() die nächste Trennzeichenposition und hol' dir mit substr() die entsprechenden Textausschnitte.)



  • Man lernt immer wieder mal was dazu. 🙂

    Find die Funktion trotzdem nicht wirklich gut, weil man die Zeichenkette über den zurückgegebenen Zeiger manipulieren kann. Die Funktion an sich ist sicher aber sie verleitet zum Programmieren von Code, der fehleranfällig ist.



  • Aus man strtok:

    BUGS
            Never use these functions.
    

    Hatten wir aber glaube ich kürzlich erst 🙂


Anmelden zum Antworten