selbstgeschriebenes strcat funktioniert nicht
-
Servus,
meine selbstgeschriebene strcat funktion funktioniert nicht.
Kann mir einer helfen den Fehler zu finden?der source
char *meine_ganz_tolle_function(char *ziel, char *quelle) { int i; int len_target; len_target = strlen(target); for(i=0;i<=strlen(source);i++){ target[len_target+i] = source[i]; } return(target); } int main(void){ char *string; char test[] = "Hallo "; char test2[] = "Welt!"; string = meine_ganz_tolle_function(test, test2); printf("%s", string); return(0); }
fehler (nutze vc++):
naja ich bekomme wenn ich "Hallo" und " Welt!" reinpushe "Hallo Wep[ganz dolle zeichen]" zurück. Aber das sollte ja nicht raus kommen sondern "Hallo"+" Welt!"debug:
nun ja in der funktion ist alles ok, der rückgabewert auch aber bei printf macht er macken...danke im nachhaus
-
sry, source = quelle und target = ziel
-
802.11b/g Mini Wireless L schrieb:
sry, source = quelle und target = ziel
Deine "tolle" funktion soll so aussehen..
char* toll(char* dest, char* source){ int i, lent, lens ; char* container ; lent= strlen(dest); lens= strlen(source); /* reserviere speicher fuer manuelle concat Ops */ container = malloc(sizeof(char)*(lent+lens)); for(i=0 ; i < lent ; i++) container[i] = dest[i] ; for(i=0 ; i < lens ; i++) container[lent+i] = source[i] ; return container ; }
Wenn du mit char arrays arbeitest dann solltest du dafuer Speicher reservieren.
Ein Schreibversuch via target[len_target+i] ergibt einen bufferoverflow wenn
dein target array von der Laenge len_target ist.Gruss,
-
Wenn es eine strcat Implementation sein soll, dann ist Speicherreservierung aber vollkommen unnötig. Zumal der Rückgabewert der erste Parameter, also das Ziel, ist. Die korrekte Signatur sieht übrigens wie folgt aus:
char * strcat(char * restrict s1, const char * restrict s2);
Und für Grössenangaben von Speicher verwendet man auch nicht int, sondern size_t bzw. ptrdiff_t. Und zweimal die Grösse mit strlen zu ermitteln, sieht Herr Schlemiel gleich doppelt ungern.
Eine der einfachsten Implementierungen von strcat ohne Abhängigkeiten sieht ungefähr so aus:char * strcat(char * restrict s1, const char * restrict s2) { size_t i = 0; char * s = s1; while (*s != '\0') ++s; while ((s[i] = s2[i]) != '\0') ++i; return s1; }
Allerdings sollte man sowas wirklich nur für Lernzwecke nutzen. Der Compiler realisiert solche Funktionen normalerweise intrinsic, was einfach effektiver ist.
-
groovemaster schrieb:
Allerdings sollte man sowas wirklich nur für Lernzwecke nutzen. Der Compiler realisiert solche Funktionen normalerweise intrinsic, was einfach effektiver ist.
Du meinst sicher effizienter!
Effektiv kann man nicht steigern.Entweder etwas ist effektiv (erfüllt das Ziel) oder es ist nicht effektiv.
Hier noch ein Link: http://www.spiegel.de/kultur/zwiebelfisch/0,1518,311601,00.html
-
groovemaster schrieb:
...Grösse mit strlen zu ermitteln, sieht Herr Schlemiel gleich doppelt ungern.
Und wer ist der Herr Schlemiel eigentlich?
-
Schlemiel? schrieb:
Und wer ist der Herr Schlemiel eigentlich?
das ist 'jiddisch' und heisst eigentlich 'Schlemiehl'. bedeutet soviel wie 'pechvogel'
-
Schlemiel? schrieb:
Und wer ist der Herr Schlemiel eigentlich?
Mehr dazu hier.
@Javaner
Ist dir langweilig? Du solltest deinen verlinkten Beitrag vielleicht noch mal genau lesen. Wenn ich mal zitieren darf:Effektiv bedeutet wirkungsvoll im Verhältnis zu den aufgewendeten Mitteln
Ohne den Aufwand einer Implementierung, bekommst du vom Compiler hier ein mindestens gleich gutes, wenn nicht sogar besseres, Ergebnis. Wenn das mal nicht effektiver ist.
Aber wenn es dich stört, dann denk dir ein "effizient". Das ist bezogen auf die intrinsic Implementierung des Compilers auch nicht falsch.
-
groovemaster schrieb:
Effektiv bedeutet wirkungsvoll im Verhältnis zu den aufgewendeten Mitteln
Nettes Zitat, jedoch leider Falsch!
Effektiv bedeutet einfach nur, daß etwas einen Effekt hat.
Obwohl Wikipedia (respektive die Wikipedia-Autoren) da auch anderer Meinung sind.
-
Ohh! Stimmt doch das Zitat
Allerdings widerlegt es meine Argumentation nicht.
(Sorry, für das zuerst fehlerhafte Posting; aber ich bin gerade im Sauf-Modus
)
-
</pedantic>
-
Stimmt!
</pedantic>
ist korrektes HTML (was ne Ableitung von XML ist/war)
-
Javaner schrieb:
Stimmt!
</pedantic>
ist korrektes HTML (was ne Ableitung von XML ist/war)
wenn wir schon nur noch am rumspammen sind...
XML kam erst _nach_ HTML auf. Beide basieren aber auf SGML.
-
Okay, hast Recht.
hab's grad ergoogelt....
-
Javaner schrieb:
Ohh! Stimmt doch das Zitat
Allerdings widerlegt es meine Argumentation nicht.
Doch. Ende der Geschichte.