Mystrncat
-
-
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
fvoid 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 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.