Mystrncat
-
Vielen Dank...Jetzt funktioniert das auch...
mfg 08mmarte
-
Korhil schrieb:
Außerdem macht dein
while (x<5)
für eine universell einsetzbare Funktion keinen Sinn.
Korhil schrieb:
... str1[x+5] = str2[x]; ...
^^ diese 5 in deinem code aber auch nicht.
-
~fricky schrieb:
Korhil schrieb:
Außerdem macht dein
while (x<5)
für eine universell einsetzbare Funktion keinen Sinn.
Korhil schrieb:
... str1[x+5] = str2[x]; ...
^^ diese 5 in deinem code aber auch nicht.
Du hast vollkommen recht, das war auch nicht der Weisheit letzter Schluß.
#include <stdio.h> #include <string.h> //... char *Mystrncat (char *str1, const char *str2, size_t maxlen) { int x=0,y; y=strlen(str1); while (x<maxlen) { str1[x+y] = str2[x]; x++; } printf ("%s", str1); return (str1); } int main() { // char t[255]="Hallo du da, "; Mystrncat (t, " Weltchen", strlen(" Weltchen")); getchar(); }
-
naja, aber was passiert bei dir, wenn 'maxlen' grösser ist als der strlen(str2)?
probier dies, ist ausserdem kürzer usw.:char *Mystrncat (char *str1, const char *str2, size_t maxlen) { while (*++str1); while (maxlen-- && *str2) *str1++ = *str2++; }
-
^^sorry, am ende fehlt noch die 0.
void *Mystrncat (char *str1, const char *str2, size_t maxlen) { while (*++str1); while (maxlen-- && *str2) *str1++ = *str2++; *str1 = 0; }
-
void Mystrncat(char *str1, const char *str2, size_t maxlen) { assert(str1 && str2); while (*str1++ && maxlen--); if(maxlen == 0) return; while (maxlen-- && *str2) *str1++ = *str2++; if(maxlen == 0) --str1; *str1 = 0; }
-
Also ich habe diesen Code verwendet:
char *Mystrncat (char *str1, const char *str2, size_t maxlen) { printf ("Die ersten %d Zeichen von '%s' werden an '%s' angehaengt\n", maxlen, str2, str1); int x=0; while (x<maxlen) { str1[x+maxlen] = str2[x]; x++; } printf ("%s", str1); return (0); }
und funktioniert so wie es sollte..
-
Die Funktion funktioniert ganz sicher nicht so wie sie sollte. Nur wenn du Glück hast und str1 genauso lang ist wie die Anzahl der Zeichen aus str2 die du kopieren willst und du bekommst auch nicht zangsläufig einen String zurück (bedenke ein String ist immer 0-terminiert, der Wert in str1 ist es am Ende deiner Funktion nicht unbedingt.
int x ist auch falsch. size_t x, solltest du hier nehmen und der Sinn des Rückgabewertes ist mir auch schleierhaft.
-
@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: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.
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 ?
-
-
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