kopie eines char[] zurückgeben



  • hi, wie gibt man eine kopie eines strings einfach zurück habs immer so gemacht:
    ich weiß er gibt ein zeiger zurück, aber keine kopie, wie mach ich das ???

    char *funktion ( char txt[] )
    {
    	strcat( txt, "ing" );
       return txt;
    }
    
    char text[10];
    
    strcpy( text, funktion( "test" )
    


  • c kopiert nix automatisch. musst selber machen. so z.b:

    char *copy (char *s)
    {
        return strcpy (malloc (strlen(s)+1), s);    
    }
    


  • net schrieb:

    c kopiert nix automatisch. musst selber machen. so z.b:

    char *copy (char *s)
    {
        return strcpy (malloc (strlen(s)+1), s);    
    }
    

    Bitte nicht, sowas machen! Wenn malloc NULL zurückliefert, dann stürtzt das Programm ab.



  • supertux schrieb:

    Bitte nicht, sowas machen! Wenn malloc NULL zurückliefert, dann stürtzt das Programm ab.

    war ja nur als einfaches beispiel gedacht. kannst ja '_try/_except' drum machen. (ich weiss, ist nicht portabel)



  • net schrieb:

    supertux schrieb:

    Bitte nicht, sowas machen! Wenn malloc NULL zurückliefert, dann stürtzt das Programm ab.

    war ja nur als einfaches beispiel gedacht. kannst ja '_try/_except' drum machen. (ich weiss, ist nicht portabel)

    auch nicht viel besser

    char* copy(const char* str)
    {
        char* tmp;
        size_t len;
        if(!str) return NULL;
    
        len = strlen(str) + 1;
    
        tmp = malloc(len);
    
        if(!tmp) return NULL;
    
        strcpy(tmp, str);
    
        return tmp;
    }
    


  • Oder ganz einfach strdup() benutzen, dafuer ist es naemlich da:

    #include <string.h>
    #include <stdlib.h>
    
    void func( void ) {
        static const char text[] = "Hallo";
        char* str = strdup( text );
        if ( str != 0 ) {
           /* ok -- mach was mit dem string */
           /* ... */
           free( str );
        }
    }
    


  • und wozu das static?



  • supertux schrieb:

    und wozu das static?

    Um klarzumachen, dass Zeichenkettenkonstanten nicht beschreibbar sind. "static const" sagt dem Compiler, dass es sich um eine statische Konstante handelt, die ins CONST DATA Segment des Programms gelegt werden darf.

    EDIT:

    char* text = "Hallo";
    text[3] = 'y';
    

    kann naemlich zu einer Segmentation Fault (Segmentierungsfehler) fuehren, wenn der Compiler die Textkonstante "Hallo" in ein nicht beschreibbares Datensegment gelegt hat (CONST DATA Segment).

    Durch "static const" wird dem Compiler nicht nur ausdruecklich erlaubt, das zu tun, sondern es verhindert auch Missverstaendnisse seitens des Programmierers.

    String-Literale wie "Hallo" sind naemlich eigentlich als Konstante anzusehen. Variable Zeichenketten muessen als Array initialisiert werden:

    int array[] = "Hallo";
    array[3] = 'y';
    

    oder besser:

    int array[] = { 'H', 'a', 'l', 'l', 'o', '\0' };  /* lang aber eindeutig */
    array[3] = 'y';
    


  • Power Off schrieb:

    [

    char* text = "Hallo";
    x[3] = 'y';
    

    kann naemlich zu einer Segmentation Fault (Segmentierungsfehler) fuehren, wenn der Compiler die Textkonstante "Hallo" in ein nicht beschreibbares Datensegment gelegt hat (CONST DATA Segment).

    das ist klar, nur in deiner Funktion ändertst du den Inhalt von text nicht, und darum ging es mir.

    edit: dank an Shade Of Mine, hab was wichtiges vergessen 😉



  • supertux schrieb:

    das ist klar, nur in deiner Funktion ändertst du den Inhalt von text und darum ging es mir.

    wo?



  • Shade Of Mine schrieb:

    supertux schrieb:

    das ist klar, nur in deiner Funktion ändertst du den Inhalt von text und darum ging es mir.

    wo?

    shit, ich wollte sagen "ändertst du den Inhalt von text nicht", und weil der Inhalt nicht geändert wird, kann man das static weglassen.



  • supertux schrieb:

    net schrieb:

    supertux schrieb:

    Bitte nicht, sowas machen! Wenn malloc NULL zurückliefert, dann stürtzt das Programm ab.

    war ja nur als einfaches beispiel gedacht. kannst ja '_try/_except' drum machen. (ich weiss, ist nicht portabel)

    auch nicht viel besser

    char* copy(const char* str)
    {
        char* tmp;
        size_t len;
        if(!str) return NULL;
        
        len = strlen(str) + 1;
        
        tmp = malloc(len);
    
        if(!tmp) return NULL;
    
        strcpy(tmp, str);
        
        return tmp;
    }
    

    naja, und du meinst das kriegste nicht zum abstürzen?



  • Power Off schrieb:

    Oder ganz einfach strdup() benutzen, dafuer ist es naemlich da

    Was soll das sein? Standard C?



  • groovemaster schrieb:

    Power Off schrieb:

    Oder ganz einfach strdup() benutzen, dafuer ist es naemlich da

    Was soll das sein? Standard C?

    sowas: http://www.koders.com/c/fidF16762E3999BA95A0B5D87AECB0525BA67CEE45A.aspx



  • net schrieb:

    naja, und du meinst das kriegste nicht zum abstürzen?

    die einzige Möglichkeit, die ich da sehe, ist wenn str kein 0-terminierendes Strings, da sollte man strncpy lieber benutzen, am sonsten fällt mir keine andere Form, diesen Code zum Absturz zu bringen.

    groovemaster schrieb:

    Power Off schrieb:

    Oder ganz einfach strdup() benutzen, dafuer ist es naemlich da

    Was soll das sein? Standard C?

    Laut meiner man pages steht CONFORMING TO: SVID 3, BSD 4.3. strndup(), strdupa(), and strndupa() are GNU extensions.

    Ich weiß ehrlich nicht, ob strdup den Standard gehört, scheint aber nicht so sein.



  • supertux schrieb:

    net schrieb:

    naja, und du meinst das kriegste nicht zum abstürzen?

    die einzige Möglichkeit, die ich da sehe, ist wenn str kein 0-terminierendes Strings, da sollte man strncpy lieber benutzen, am sonsten fällt mir keine andere Form, diesen Code zum Absturz zu bringen.

    na so z.b:

    const char *s = (const char*)-1;
        copy(s);
    

    btw: das mit dem _try/_except hätte auch dabei geholfen 😃



  • net schrieb:

    btw: das mit dem _try/_except hätte auch dabei geholfen 😃

    das nervt!



  • Shade Of Mine schrieb:

    net schrieb:

    btw: das mit dem _try/_except hätte auch dabei geholfen 😃

    das nervt!

    weil's kein ansi-c ist?



  • net schrieb:

    weil's kein ansi-c ist?

    das nur zum teil.

    aber was haben in solch einer funktion trys verloren?
    nichts. die funktion wie sie supertux geschrieben hat kann nicht fehlschlagen.

    warum? weil ein ungueltiger string eine verletzung des vertrags ist, den der caller mit dem callee eingeht. dh, dann schlaegt der caller fehl.

    es ist bloedsinn hier _try zu verwenden und das in einem ansi C forum vorzuschlagen ist noch groesserer bloedsinn.

    es hat hier naemlich nicht nur keinen sinn sondern ist auch noch ot.



  • Shade Of Mine schrieb:

    es ist bloedsinn hier _try zu verwenden und das in einem ansi C forum vorzuschlagen ist noch groesserer bloedsinn.

    sagte ich doch schon, dass das nicht portabel ist. blödsinn isses aber auf keinen fall. auf systemen, die das haben sollte man es auch einsetzen. windoofs z.b. hätte 80% weniger blue screens wenn alle treiber-coder _try/_except benutzen würden


Anmelden zum Antworten