Muss eigene strcpy schreiben



  • Hi jungs (und mädels)

    wir üben gerade mit strings also char arrays

    und da sollen wir eine eigene strcpy funktion schreiben

    in der main funktion klappt das mittleweile ganz gut, aber nicht wenn es einer funktion steckt. Irgendwie seh ich die änderung nur, so lange die funktion aktiv ist, sobald man raus ist ist die änderung verloren.

    void ownstrcpy(char* str_zielstring, char* str_quellstring)
    {		
    	int i;
    	if ((str_zielstring = (char*)malloc(strlen(str_quellstring))) != NULL)
    	{
    		for (i = 0; str_quellstring[i] != 0; i++)
    			str_zielstring[i] = str_quellstring[i];
    		str_zielstring[i] = '\0';
    	}	
    }
    

    was is da falsch?
    gruß



  • UnIoN schrieb:

    was is da falsch?

    fast alles 😉

    void ownstrcpy (char* str_zielstring, char* str_quellstring)
    {       
      while (*str_quellstring)
        *str_zielstring++ = *str_quellstring++;
      *str_zielstring = 0; 
    }
    


  • das malloc war mit absicht, soll verhindern auf speicher zu schreiben der dir nicht gehört

    was ich hier auch bekommen würde mit

    char *test = "ABC";
    char *test2 = "XYZ?";
    ownstrcpy(test, test2);
    

    mir fällt auch grad auf, dein code ersetzt nicht, sondern löscht beide strings
    und auch hier gehen die veränderungen verloren, sobald man aus der funktion raus ist.



  • UnIoN schrieb:

    mir fällt auch grad auf, dein code ersetzt nicht, sondern löscht beide strings
    und auch hier gehen die veränderungen verloren, sobald man aus der funktion raus ist.

    was? wie das?

    vielleicht so?

    char *ownstrcopy (char *str_quellstring)
    {
       char *p = malloc (strlen(str_quellstring)+1);
       if (p)
       {
          char *q = p;
          while (*str_quellstring)
             *q++ = *str_quellstring++;
          *q = 0;
       }
       return p;
    }
    

    🙂



  • char *x(char *dest, char *src)
    {
      memmove(dest, src, strlen(src)+1);
      return dest;
    }
    
    char *y(char *dest, char *src)
    {
      char *ret = dest;
      do
          *dest++ = *src;
      while(*src++);
      return ret;
    }
    

    Wenn der neue String zusätzlich neuen Platz braucht:

    char *z(char *src)
    {
      return strdup(src);
    }
    


  • Erstens ist strdup() nicht ANSI C und zweitens sieht es so aus als will UnIoN eben dieses nachbauen 😉



  • TactX schrieb:

    Erstens ist strdup() nicht ANSI C und zweitens sieht es so aus als will UnIoN eben dieses nachbauen 😉

    du hast es erfasst

    und außerdem funktioniert es mit dem code aus dem ersten posting von mir ja auch

    aber eben nicht funktionsübergreifend, was ich nicht verstehe warum

    ich versuch einfach mal weiter evtl. bekomm ich ja noch den fehler raus...



  • UnIoN schrieb:

    aber eben nicht funktionsübergreifend, was ich nicht verstehe warum

    mach aus deinem zielstring statt 'char*' ein 'char**' und lass dich durch die antworten hier inspirieren.
    dann kriegstes schon hin 😉


Anmelden zum Antworten