Mystrncat



  • 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
    .



  • Das finde ich intuitiv, da ein Array mit z. B. 15 Elementen nur eine null-terminierte Zeichenkette der Länge 14 aufnehmen kann.



  • Hya! 🕶

    #include <stdio.h>
    
    char* StrnCat ( char* dst, char* src, unsigned n )
    {
        char* s = dst;
    
        while ( *dst )
            dst++;
    
        while ( n-- && *src )
            *dst++ = *src++;
    
        *dst = 0;
    
        return s; 
    }
    
    int main( void )
    {
        char a[256] = { "There's no other " };
        char b[256] = { "like Big Brother!\n:-)" };
    
        puts ( StrnCat ( a, b, 3000+1 ) );
        getchar();
    
        return 0;
    }
    

    🙂


Anmelden zum Antworten