char * my_strcpy... was bedeuted das?

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: char * my_strcpy... was bedeuted das?

Beitrag von Xin » Fr Jan 27, 2012 1:40 pm

do6dm hat geschrieben:Hmm, OK.
@ Xin, ja das Tutorial schau ich mir seid gestern an, ist auf jedenfall besser als mein Script! Dadurch bin ich auf diese Seite gestoßen. Wolltest du auch auf das Problem hinaus, dass ich irgendwas im Speicher überschreib, mit meiner glorreichen for-Schleife? :D Weil ansonsten seh ich da kein Problem mehr.
Ich kann mich nur wiederholen.
Geh die Sache mit der Hand auf dem Papier durch. Der Satz enthält eine Aussage, die mir zeigt, dass Du das bisher nicht getan hast.
do6dm hat geschrieben:Aber generell die Frage, funktioniert das überhaupt mit dem len += 1, dass mir dadurch noch das \0 mitkopiert bzw. vom Quellstring "geholt" wird?
Alles eine Frage der Formulierung. Läufst Du bis i < strlen() oder bis i <= strlen(). Entsprechend +1 oder nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: char * my_strcpy... was bedeuted das?

Beitrag von do6dm » Sa Jan 28, 2012 7:15 pm

Xin hat geschrieben: Ich kann mich nur wiederholen.
Geh die Sache mit der Hand auf dem Papier durch. Der Satz enthält eine Aussage, die mir zeigt, dass Du das bisher nicht getan hast.
Ich komm nicht drauf, leider :(

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: char * my_strcpy... was bedeuted das?

Beitrag von Xin » Sa Jan 28, 2012 7:58 pm

do6dm hat geschrieben:
Xin hat geschrieben: Ich kann mich nur wiederholen.
Geh die Sache mit der Hand auf dem Papier durch. Der Satz enthält eine Aussage, die mir zeigt, dass Du das bisher nicht getan hast.
Ich komm nicht drauf, leider :(
Hast Du die hier gepostete my_strcpy-Funktion mal Schritt für Schritt nachvollzogen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: char * my_strcpy... was bedeuted das?

Beitrag von do6dm » Sa Jan 28, 2012 8:23 pm

Ja, so ca. 20 mal :) Die funktioniert auch wenn ich sie kompiliere.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: char * my_strcpy... was bedeuted das?

Beitrag von Xin » Sa Jan 28, 2012 10:12 pm

do6dm hat geschrieben:Ja, so ca. 20 mal :) Die funktioniert auch wenn ich sie kompiliere.
Und Dir fällt nicht auf, dass Du zwei for-Schleifen ineinander geschachtelt hast?

Erkläre Dir/Mir doch mal, was die innere For-Schleife macht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: char * my_strcpy... was bedeuted das?

Beitrag von do6dm » Mo Jan 30, 2012 7:47 pm

Ja, die bräuchte ich nicht, da würd eine auch reichen, das hab ich gesehen. Aber das ist bestimmt nicht das was ich falsch mache, oder?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: char * my_strcpy... was bedeuted das?

Beitrag von Xin » Mo Jan 30, 2012 8:41 pm

do6dm hat geschrieben:Ja, die bräuchte ich nicht, da würd eine auch reichen, das hab ich gesehen. Aber das ist bestimmt nicht das was ich falsch mache, oder?
Wenn Du von München nach Flensburg fliegst, und dabei an Rom, Afrika, dem Südpol, Australien und dem Nordpol vorbeikommst, bevor Du in Flensburg landest, dann hast Du das Ziel erreicht.

Aber hast Du es richtig gemacht?

Dein Mindest-Anspruch muss sein, es richtig zu machen, nicht nur irgendwie ein Ergebnis zu produzieren.

Wie sieht der aktuelle Quelltext aus?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: char * my_strcpy... was bedeuted das?

Beitrag von do6dm » Di Jan 31, 2012 11:04 am

Das gute ist hier, mein Prof will auch alles genau so richtig und exakt wie du :D

Code: Alles auswählen

    char * my_strcpy(char *dest, const char *src);

    int main(){
       char src[]= "quelle";
       char dest[] = "ziel";

       my_strcpy(dest, src);        // funktionsaufruf
       printf("my_strcpy %s\n" , dest);

        system("PAUSE");
        return 0;
    }

    char * my_strcpy(char *dest, const char *src){                    // String kopiern
         int len = strlen(src);
             
         int i;
         // len +=1 gelöscht, dafür in der for-schleife statt i<len, i<=len geschrieben.
         
         for(i=0; i<=len; i++){
                  dest[i]=src[i];
          }
         
       return dest;
         
    }
Nun aber die Frage, mein scr ist doch länger als dest, wieso kann ich das jetzt trotzdem in dest kopieren. Ich dachte die Länge von dest wird in der zeile
char dest[] = "ziel";
fest auf 4+ \0 festgelegt?

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: char * my_strcpy... was bedeuted das?

Beitrag von do6dm » Di Jan 31, 2012 11:36 am

Ich weiß glaub jetzt was du meinst.^^ Meine Funktion macht zwar das gleiche wie die strcpy Funktion, allerdings macht sie es nicht gleich.
Wenn ich das richtig sehe, kopiert ja die originale strcpy solange, bis ein \0 vorkommt.

Hier hab ich mal was anderes geschrieben, das ist glaub besser:

Code: Alles auswählen

    char * my_strcpy(char *dest, const char *src);

        int main(){
           char src[]= "quelle";
           char dest[] = "ziel";

           my_strcpy(dest, src);        // funktionsaufruf
           printf("my_strcpy %s\n" , dest);

            system("PAUSE");
            return 0;
        }

        char * my_strcpy(char *dest, const char *src){                    // String kopiern
         int i=0;    
                         while(src[i]){
                         dest[i]=src[i];
                         i++;
                         }
          dest[i]=src[i];  // kopiert nullbyte auch noch      
             
           return dest;
             
        }

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: char * my_strcpy... was bedeuted das?

Beitrag von Xin » Di Jan 31, 2012 1:21 pm

do6dm hat geschrieben:Ich weiß glaub jetzt was du meinst.^^ Meine Funktion macht zwar das gleiche wie die strcpy Funktion, allerdings macht sie es nicht gleich.
Gleichheit zu einer anderen Funktion ist kein Kriterium, im Regelfall programmiert man ja auch nicht vorhandenes nach.

Das Kritierium ist, dass a) ein richtiges Ergebnis dabei herumkommt - das hattest Du ja bereits erreicht - und b) dass dieses Ergebnis mit möglichst minimalen Rechenaufwand erreicht wird (unter Berücksichtigung der Lesbarkeit des Codes) und c) dass der Code gut wartbar (lesbar, veränderbar, wiederverwertbar) ist.

Die Eigenschaften b) und c) wurden von Deinem Code nicht erfüllt.
do6dm hat geschrieben: Wenn ich das richtig sehe, kopiert ja die originale strcpy solange, bis ein \0 vorkommt.

Hier hab ich mal was anderes geschrieben, das ist glaub besser:
my_strcpy ist auf Deinem Level top, die würde ich so akzeptieren.
Vielleicht die letzte Zuweisung ist unschön: Du weißt, dass src == '\0' ist, es ist also Mehraufwand die '\0' nochmals von src zu lesen. Du kannst dest also gleich auf '\0' setzen.

Du kopierst in main weiterhin einen längeren String auf ein zu kurzes Array, aber das ist ein anderes Problem.

In C gibt es noch genug zu lernen, Du kannst also my_strcpy nochmal deutlich beschleunigen, wenn Du auf die Array-Zugriffe verzichtest. Da muss man allerdings dann fragen, ob Du soweit schon bist. Von daher folgendes zum 'Mal gesehen haben' und später auch zum Auswendig können, weil es quasi wie eine Floskel in der Sprache C ist.

Code: Alles auswählen

char * my_strcpy(char *dest, const char *src)
{        
  while( *dest++ = *src++ );             

  return dest;
}
Je nach CPU geht noch mehr, aber da verlassen wir den Rahmen, den C/C++ ausspannt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten