Stringcat selber Programmieren



  • ja ok er führt die schleife einmal zuviel aus, aber müsste er nicht trotzdem was hinkopieren? oder eben nicht weil nach dem ersten string nichts mehr initialisiert ist?

    bei meinem Programm oben ist das char * string_cat doch total unnütz und auch der rückgabewert oder? ich mein ich arbeite da ja mit Pointern die den string im main verändern, für was ist dann der char * rückgabewert?



  • mazeli schrieb:

    ja ok er führt die schleife einmal zuviel aus, aber müsste er nicht trotzdem was hinkopieren? oder eben nicht weil nach dem ersten string nichts mehr initialisiert ist?

    das problem dabei ist: jeder string hat ja ein null zeichen am ende.
    wenn du jetzt die string "hi" und "ho" hast, dann macht dein string cat ein
    "Hi\0Ho" daraus. und \0 zeigt ja an dass der string hier endet.

    btw, dein return ist auch noch falsch - worauf zeigt der zeiger denn den du zurueck gibst?

    bei meinem Programm oben ist das char * string_cat doch total unnütz und auch der rückgabewert oder? ich mein ich arbeite da ja mit Pointern die den string im main verändern, für was ist dann der char * rückgabewert?

    im prinzip ist das return von strcat ziemlich unnoetig.

    _aber_ manchmal kann es nett sein wenn man zB
    printf("%s",strcat(s1,s2));
    oder aehnliches machen will.

    deshalb soll strcat einen zeiger auf den target string returnen damit man ab und zu mal solche abkuerzungen schreiben kann.

    von der logik der funktion strcat her, ist das return aber nicht noetig und void return wuerde reichen (es ist quasi nur da um in manchen situationen es etwas bequemer zu haben).



  • wie müsste das return dann richtig heissen?



  • char * string_cat(char *s1Ptr, char *s2Ptr)
    {
        char *original_s1Ptr = s1Ptr;
    
        int lv, x, y;
    
        x = string_laenge(s1Ptr);
        y = string_laenge(s2Ptr);
    
        for(lv = 0; lv <= x; lv++)
        {
            s1Ptr++;
        }
        for(lv = x; lv <= (y+x); lv++)
        {
            *s1Ptr = *s2Ptr;
            s1Ptr++;
            s2Ptr++;
        }
    
        //printf("\nDie beiden Strings zusammengefuegt ergeben: %s", *s1Ptr);
    
        return original_s1Ptr;
    }
    

    Du hast jedoch oben von meiner Wenigkeit in Kooperation mit Shade eine weitaus sauberere Version bekommen.

    ich würd:

    char * string_cat(char *s1Ptr, char *s2Ptr)
    {
        char *p = s1Ptr;
    
        while( *++p );
        while( *p++ = *s2Ptr++ );
    
        return s1Ptr;
    }
    

    Greetz, Swordfish



  • Swordfish schrieb:

    char * string_cat(char *s1Ptr, char *s2Ptr)
    {
        char *p = s1Ptr;
    
        while( *++p );
        while( *p++ = *s2Ptr++ );
    
        return s1Ptr;
    }
    

    wer findet den bug?



  • Wow, den (Bug) hab ich ja gut versteckt - Hätt' ihn fast selbst nicht wiedergefunden 😉

    char * string_cat(char *s1Ptr, char *s2Ptr)
    {
        char *p = s1Ptr;
    
        while( *p ) ++p;
        while( *p++ = *s2Ptr++ );
    
        return s1Ptr;
    }
    

    Greetz, Swordfish



  • #include <stdio.h>
    
    int string_laenge(char *);
    
    char * string_cat(char *, char *);
    
    char * string_cat(char *s1Ptr, char *s2Ptr)
    {
    	int lv, x, y;
    	char *sPointer;
    
    	sPointer = s1Ptr;
    
    	x = string_laenge(s1Ptr);
    	y = string_laenge(s2Ptr);
    
    	for(lv = 0; lv < x; lv++)
    	{
    		s1Ptr++;
    	}
    	for(lv = x; lv < (y+x); lv++)
    	{
    		*s1Ptr = *s2Ptr;
    		s1Ptr++;
    		s2Ptr++;
    	}
    
    	//printf("\nDie beiden Strings zusammengefuegt ergeben: %s", *s1Ptr);
    
    	return sPointer;
    }
    
    int string_laenge(char *sPtr)
    {
    	int i = 0;
    
    	while(*sPtr != '\0')
    	{
    		i++;
    		sPtr++;
    	}
    	return i;
    }
    
    int main(void)
    {
    	int x, y;
    	char str1[40+1];
    	char str2[40+1];
    	char *hPtr;
    
    	printf("Bitte geben Sie den ersten String ein: ");
    	gets(str1);
    	printf("\nBitte geben Sie den zweiten String ein: ");
    	gets(str2);
    
    	printf("\nString1: %s, String2: %s", str1, str2);
    
    	//string_cat(str1, str2);
    
    	printf("\nNeuer String1: %s", string_cat(str1, str2));
    
    	return 0;
    }
    

    So es ist vollbracht 😃 nach den beiden strings gibt der mir zwar noch irgendwelchen müll aus aber egal, man war das ne schwere geburt 😃

    Danke euch allen,

    aber eins versteh ich noch nicht. Wieso kann ich nicht einfach den s1Ptr zurückgeben? Wieso erst noch einen Pointer auf diesen machen?

    PS: Klar ist das oben bei weitem nicht die beste Lösung, aber wenn ich eure genommen hätte, wäre der lerneffekt nicht so groß gewesen denke ich 😃

    Da fällt mir noch was ein, was zur hölle ist size_t? google find ich nix brauchbares und in meinem sogenannten c Buch für einsteiger steht auch keine Erklärung oder Definition oder sonst was.

    EDIT2: Ist ja klar das der mir müll ausgibt wenn ich keine Endekennung setze 😃



  • mazeli schrieb:

    aber eins versteh ich noch nicht. Wieso kann ich nicht einfach den s1Ptr zurückgeben? Wieso erst noch einen Pointer auf diesen machen?

    Weil du s1Ptr in deinen beiden Schleifen erhöhst und dieser logischerweise nicht mehr auf den Anfang deines zusammengestückelten Strings zeigen kann.

    mazeli schrieb:

    Da fällt mir noch was ein, was zur hölle ist size_t? google find ich nix brauchbares und in meinem sogenannten c Buch für einsteiger steht auch keine Erklärung oder Definition oder sonst was.

    size_t ist ein unsigned typ für Speichergrößen. Ist zB. immer das Resultat des sizeof( ) operators.

    Greetz, Swordfish



  • hmm klingt logisch 😃

    Also könnte ich ihn doch benutzen wenn ich den Pointer wieder runterzähle (ist shcwachsinn ok aber nur wegen dem verständniss her)

    Danke 😃



  • mazeli schrieb:

    ist shcwachsinn ok [...]

    lol, ja... 😃

    Greetz, Swordfish


Anmelden zum Antworten