Mystrncat



  • @rüdiger: Sorry hab das

    char t[255]="Hallo";
    	Mystrncat (t, " Weltchen", 5);
    

    vergessen...



  • Korhil schrieb:

    @rüdiger
    Sicherlich ist mein Vorschlag immer noch nicht der Weisheit letzter Schluß und hier schon bessere Vorschläge gemacht worden. Ich hab zu deiner Äußerung allerdings noch eine Frage:

    Das bezog sich auf die Funktion von 08mmarte.

    rüdiger schrieb:

    ...Nur wenn du Glück hast und str1 genauso lang ist wie die Anzahl der Zeichen aus str2 die du kopieren willst ...

    Ich glaub, ich steh gerade auf dem Schlauch. str1 muss nicht genauso groß sein wie str2, oder ? Es muss nur gegeben sein, dass str1 & str2 zusammen nicht zu groß sind.

    str1 muss so groß sein, wie der String der in str1 ist und die Anzahl der Zeichen die aus str2 kopiert werden soll und das terminierende Nullbyte.

    rüdiger schrieb:

    ...und du bekommst auch nicht zangsläufig einen String zurück ...

    Wenn ich einen String so anhänge, wird doch die '\0' mitkopiert, oder ?

    Nur wenn du das Nullbyte auch mitkopierst, was ja nicht zwangsläufig sein muss (wenn maxlen < strlen(str2) ist).

    08mmarte schrieb:

    @rüdiger: Sorry hab das

    char t[255]="Hallo";
    	Mystrncat (t, " Weltchen", 5);
    

    vergessen...

    Das zeigt doch genau das Problem. Du hast wahrscheinlich gerade Glück, dass der Rest von t mit 0en initialisiert ist, aber das kann man ja schnell ändern

    char t[255];
      memset(t, 'A', 255);
      t[254] = '\0';
      strcpy(t, "Hallo");
      Mystrncat(t, " Weltchen", 5);
    

    oder schau dir das Beispiel an

    char s[255] = "Hallo ";
      Mystrncat(s, "Weltchen", 4);
    

    verstehst du nun, warum deine Funktion nicht das tut, was sie tun soll?



  • @rüdiger
    bei deiner Methode gubt es mir nicht nur Hallo Welt aus sondern Hallo WeltAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAetc.
    Ich habe das so gelöst:

    str1[x+maxlen]='\0';
    

    Ich hoffe es stimmt so...



  • *g* Das mit dem terminierende Nullbyte ist schon eine witzige Sache.

    rüdiger schrieb:

    void Mystrncat (char *str1, const char *str2, size_t maxlen) {
      while (*str1++ && maxlen--);
      if(maxlen == 0)
        return;
      while (maxlen-- && *str2)
        *str1++ = *str2++;
      if(maxlen == 0)
       --str;
      *str1 = 0;
    }
    

    Kann das sein, das du bei "--str;" eine Ziffer vergessen hast ?

    10 C:\... `str' undeclared (first use in this function)
    


  • gebt auch mal bei google 'strncat filetype:c' ein.
    🙂



  • eine Variante mit for wobei natürlich fricky's Version kürzer ist 😉
    f

    void my_strncat(char *dst, const char *src, size_t n)
    {
           size_t len = strlen(src);
    
           for(; *dst; dst++)
                  ;
           for(; n > 0 && len >= n; n--)
    ´         *dst++ = *src++;
    
            *dst = '\0';
    }
    

    🙂



  • ok leute, ich setz mich nachher mal ran.



  • 08mmarte schrieb:

    @rüdiger
    bei deiner Methode gubt es mir nicht nur Hallo Welt aus sondern Hallo WeltAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAetc.
    Ich habe das so gelöst:

    str1[x+maxlen]='\0';
    

    Ich hoffe es stimmt so...

    Und das zweite Beispiel von mir 🙄

    @Korhill
    ja, das sollte wohl --str1 sein.

    @cLover
    Das strlen am Anfang ist aber keine gute Idee. Warum nicht einfach prüfen ob *src == '\0' ist? :).



  • Da muss ich dir zustimmen 🙂



  • frickys variante ist schon ganz ok die kannst du nehmen



  • Vielen Dank



  • ascda schrieb:

    frickys variante ist schon ganz ok die kannst du nehmen

    wobei rüdis version mehr fehler abfängt. in meine müssten vielleicht 'asserts' rein.
    🙂



  • ~fricky schrieb:

    ascda schrieb:

    frickys variante ist schon ganz ok die kannst du nehmen

    wobei rüdis version mehr fehler abfängt. in meine müssten vielleicht 'asserts' rein.
    🙂

    Spür ich da einen gewissen positiven Einfluss? 🙂



  • rüdiger schrieb:

    Spür ich da einen gewissen positiven Einfluss?

    nö, ich wollte nur nicht, dass deine recht gute variante hier ganz untergeht.
    🙂



  • Hallo zusammen,

    ~frickys Funktion ist falsch.

    Für

    char s1[10] = "Hallo\0XXX";
            char s2[] = " blauer Schlumpf!";
            Mystrncat(s1, s2, 10);
    

    erhalten wir

    Hallo blauer Sc
    Segmentation fault

    maxlen muss auch in der ersten Schleife dekrementiert werden! rüdigers Funktion ist diesbezüglich korrekt, while (*str1++ && maxlen--).

    Noch eine Kleinigkeit:

    Die Signatur deiner Funktion sagt aus, dass diese einen void-Zeiger (void*) zurückgebe. Tatsächlich wird überhaupt kein Wert retourniert.

    Grüße
    Martin



  • Hallo nochmal,

    was haltet ihr hiervon? Analog zu strcat werden maximal maxlen+1 Zeichen geschrieben, da '\0'. Das heißt bei char s[n]=... muss der Aufruf mystrcat(s,x,n-1) lauten.

    Grüße

    void mystrcat(char *str1, const char *str2, size_t maxlen)
    {
    	char *e = str1 + maxlen;
    
    	while (*++str1) ;
    	while (str1 != e && (*str1++ = *str2++)) ;
    
    	*str1 = '\0';
    }
    


  • lucky_tux schrieb:

    while (str1 != e && (*str1++ = *str2++)) ;
    

    vielleicht besser while (str1 < e ...
    🙂



  • nein



  • @lucky_tux

    hmm, maxlen+1 Zeichen finde ich nicht so geschickt.

    void mystrcat(char *dst, const char *src, size_t maxlen)
    {
      assert(dst && src);
      char *const end = dst + maxlen - 1;
    
      while (*dst++) ; // hier *dst++, falls strlen(dst) == 0!
      --dst;
      while (dst != end && (*dst++ = *src++)) ;
    
      *dst = '\0';
    }
    


  • rüdiger schrieb:

    @lucky_tux

    hmm, maxlen+1 Zeichen finde ich nicht so geschickt.

    man strcat schrieb:

    char *strncat(char *dest, const char *src, size_t n);

    DESCRIPTION
    The strcat() function appends the src string to the dest string overr‐
    writing the ‘\0’ character at the end of dest, and then adds a termii‐
    nating ‘\0’ character. The strings may not overlap, and the dest
    string must have enough space for the result.

    The strncat() function is similar, except that it will use at most n
    characters from src. Since the result is always terminated with ‘\0’,
    at most n+1 characters are written
    .


Anmelden zum Antworten