Mystrncat
-
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 faultmaxlen 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; }