Seite 1 von 3

char * my_strcpy... was bedeuted das?

Verfasst: Fr Jan 27, 2012 9:17 am
von do6dm
Hallo zusammen,

also meine Aufgabe war es, die strcpy funktion selber zu schreiben. Das hat auch geklappt, nur hab ich keine Ahnung was mein programm da jetzt genau macht. :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, j;
     len +=1;
     
     for(i=0; i<len; i++){
              for(j=i; j<=i; j++){
              dest[i]=src[j];
              }
     } 
     
   return dest;
     
}

Weiß jemand, was genau char * my_strcpy(char *dest, const char *src) macht? Also gerade der Pointer nach char.
Und ist mein Funktionsaufruf richtig? Brauch ich da nicht & vor dest und src? So übergeb ich doch nur variablen und keine Adressen, aber das ding funktioniert. :D Aja, und egal was ich bei return hinschreibe, ob dest, bier oder egal, es wird immer das richtige ausgegeben.
Bitte um Hilfe, Danke!

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

Verfasst: Fr Jan 27, 2012 10:44 am
von Xin
do6dm hat geschrieben:Hallo zusammen,

also meine Aufgabe war es, die strcpy funktion selber zu schreiben. Das hat auch geklappt, nur hab ich keine Ahnung was mein programm da jetzt genau macht. :D
Woher kommt die Aufgabe und machst lernst Du C freiwillig? ^^
do6dm hat geschrieben:Weiß jemand, was genau char * my_strcpy(char *dest, const char *src) macht? Also gerade der Pointer nach char.
Da sind zwei Pointer auf char, einmal vor dem dest-Parameter und einmal ganz vorne als Rückgabeparameter.
do6dm hat geschrieben:Und ist mein Funktionsaufruf richtig? Brauch ich da nicht & vor dest und src? So übergeb ich doch nur variablen und keine Adressen, aber das ding funktioniert.
Da hast Du vom Prinzip her recht und genauso ist es auch.
Ein Array ist aber im Prinzip nichts anderes als die Adresse auf das vorderste Element. Daher kannst ein Array auch dann übergeben, wenn eine Adresse gefragt wird. Es entspricht dann &array[0] (auf Deutsch: Adresse des vordersten Elements).
do6dm hat geschrieben:Aja, und egal was ich bei return hinschreibe, ob dest, bier oder egal, es wird immer das richtige ausgegeben.
Bitte um Hilfe, Danke!
"bier"?

Entweder ist Dein Compiler nun besoffen oder Du hast vergessen zu kompilieren. ;-)


Ich bringe gelegentlich Leuten auch programmieren bei. die "my_strcpy" Funktion kommt da auch häufig vor.
Ich würde Dir die my_strcpy-Funktion nicht abnehmen im Sinne von "Lernziel" erreicht. ;-)

Die Fassung, die Du geschrieben hast könnte funktionieren. Geh sie nochmal von Hand auf dem Papier durch und überlege, ob sie tut, was Du willst oder ob Du nur das gewünschte Ergebnis bekommst. ;-)

Willkommen im Forum.

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

Verfasst: Fr Jan 27, 2012 12:00 pm
von do6dm
Xin hat geschrieben: Woher kommt die Aufgabe und machst lernst Du C freiwillig? ^^
Ich studiere Elektrotechnik, und da darf ich C lernen. Die Aufgabenstellung lautet genau: Programmieren Sie die folgende String-Funktionen und schreiben ein geeignetes Programm, um sie
zu testen: char * my_strcpy(char *dest, const char *src); // src in dest kopieren, inklusive '\0', liefert dest.
Xin hat geschrieben:
do6dm hat geschrieben:Weiß jemand, was genau char * my_strcpy(char *dest, const char *src) macht? Also gerade der Pointer nach char.
Da sind zwei Pointer auf char, einmal vor dem dest-Parameter und einmal ganz vorne als Rückgabeparameter.
Das hab ich jetzt leider auch nicht verstanden :( Ich dachte, wenn ich in der Funktion mit Zeigern arbeite, ändert meine my_strcpy Funktion auch die Strings in der Main Funktion. Also bei mir z.B dest[]. Wo "geht" dann der Rückgabeparameter hin, bzw auf was zeigt das?

Xin hat geschrieben: Ich bringe gelegentlich Leuten auch programmieren bei. die "my_strcpy" Funktion kommt da auch häufig vor.
Ich würde Dir die my_strcpy-Funktion nicht abnehmen im Sinne von "Lernziel" erreicht. ;-)

Die Fassung, die Du geschrieben hast könnte funktionieren. Geh sie nochmal von Hand auf dem Papier durch und überlege, ob sie tut, was Du willst oder ob Du nur das gewünschte Ergebnis bekommst. ;-)

Willkommen im Forum.
Hmm, also ich seh da keinen Fehler^^. Mit strlen guck ich ja wieviele Zeichen in meinem "Quellstring drin sind". Da strlen ja das nötige \0 nicht mitzählt, hab ich dann noch len +=1 gemacht, in der Hoffnung, dass er mir das \0 aus meinem Quellstring mit rein kopiert. Anstonsten kopiert ja der code in der for-schleife Zeichen für Zeichen von dest nach src. Was hab ich da übersehen?

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

Verfasst: Fr Jan 27, 2012 12:13 pm
von cloidnerux
Das hab ich jetzt leider auch nicht verstanden Ich dachte, wenn ich in der Funktion mit Zeigern arbeite, ändert meine my_strcpy Funktion auch die Strings in der Main Funktion. Also bei mir z.B dest[]. Wo "geht" dann der Rückgabeparameter hin, bzw auf was zeigt das?
Dein Rückgabe-Parameter wird zurückgegeben und somit musst du es einer Variable zuweisen, damit dein Programm weiß, was mit dem Wert gemacht werden soll:

Code: Alles auswählen

int add(int a, int b){return a+b;}
...
int ergebniss = add(1, 2);
In deinem Fall machst du mit dem Rückgabewert nichts, daher passiert auch nichts wenn du ihn änderst.
Hmm, also ich seh da keinen Fehler^^. Mit strlen guck ich ja wieviele Zeichen in meinem "Quellstring drin sind". Da strlen ja das nötige \0 nicht mitzählt, hab ich dann noch len +=1 gemacht, in der Hoffnung, dass er mir das \0 aus meinem Quellstring mit rein kopiert. Anstonsten kopiert ja der code in der for-schleife Zeichen für Zeichen von dest nach src. Was hab ich da übersehen?
Was passiert, wenn der Text in src länger ist als der in dest?

MfG cloidnerux

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

Verfasst: Fr Jan 27, 2012 12:31 pm
von do6dm
cloidnerux hat geschrieben: Was passiert, wenn der Text in src länger ist als der in dest?

MfG cloidnerux
Dann kopiert es doch src in dest rein, weil meine for-schleife zählt ja dann so lang bis die länge von src +1 erreicht ist. Oder kann ich mein dest nicht so einfach "größer" machen? Also ich meine, ob die Länge von meinen dest String irgendwie fest auf 4 Zeichen festgelegt wurde, als ich char dest[] = "ziel" deklariert habe?

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

Verfasst: Fr Jan 27, 2012 12:33 pm
von Xin
do6dm hat geschrieben:
Xin hat geschrieben: Woher kommt die Aufgabe und machst lernst Du C freiwillig? ^^
Ich studiere Elektrotechnik, und da darf ich C lernen.
ET, schön. :-)

Schonmal das C-Tutorial angesehen?
do6dm hat geschrieben:
Xin hat geschrieben:
do6dm hat geschrieben:Weiß jemand, was genau char * my_strcpy(char *dest, const char *src) macht? Also gerade der Pointer nach char.
Da sind zwei Pointer auf char, einmal vor dem dest-Parameter und einmal ganz vorne als Rückgabeparameter.
Das hab ich jetzt leider auch nicht verstanden :( Ich dachte, wenn ich in der Funktion mit Zeigern arbeite, ändert meine my_strcpy Funktion auch die Strings in der Main Funktion. Also bei mir z.B dest[]. Wo "geht" dann der Rückgabeparameter hin, bzw auf was zeigt das?
Du gibst hier return dest zurück. Der Zeiger zeigt also auch auf dest.

Wenn Du mit Zeigern arbeitest, kannst Du das ändern, auf das Du zeigst. Wenn Du auf Arrays in der main-Funktion zeigst, dann kannst Du diese ändern, richtig.
do6dm hat geschrieben:
Xin hat geschrieben: Ich bringe gelegentlich Leuten auch programmieren bei. die "my_strcpy" Funktion kommt da auch häufig vor.
Ich würde Dir die my_strcpy-Funktion nicht abnehmen im Sinne von "Lernziel" erreicht. ;-)

Die Fassung, die Du geschrieben hast könnte funktionieren. Geh sie nochmal von Hand auf dem Papier durch und überlege, ob sie tut, was Du willst oder ob Du nur das gewünschte Ergebnis bekommst. ;-)
Hmm, also ich seh da keinen Fehler^^. Mit strlen guck ich ja wieviele Zeichen in meinem "Quellstring drin sind". Da strlen ja das nötige \0 nicht mitzählt, hab ich dann noch len +=1 gemacht, in der Hoffnung, dass er mir das \0 aus meinem Quellstring mit rein kopiert. Anstonsten kopiert ja der code in der for-schleife Zeichen für Zeichen von dest nach src. Was hab ich da übersehen?
Zum einen die Frage, die Cloidnerux fragt und zum anderen hast Du mir erklärt, was Du tun willst.
Du hast Dir aber kein Papier zur Hand genommen und Schritt für Schritt durchgegangen, was Du programmiert hast. :-)

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

Verfasst: Fr Jan 27, 2012 12:34 pm
von cloidnerux
Also ich meine, ob die Länge von meinen dest String irgendwie fest auf 4 Zeichen festgelegt wurde, als ich char dest[] = "ziel" deklariert habe?
Ja.
Und hier beginnt ein Problem: Alle Variablen, Code und sonstiges liegt im RAM direkt Hintereinander.
Wenn du nun über die Grenzen deines dest-Stringes hinaus schreibst, überschreibst du alles was dahinter liegt. Das das schlecht ist, sollte jedem klar werden.
Um das zu lösen gibt es die Funktion "malloc". Schau dir an was sie macht und wie sie Funktioniert.

MfG cloidnerux

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

Verfasst: Fr Jan 27, 2012 12:52 pm
von do6dm
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.
Aber generell die Frage, funktioniert das überhaupt mit dem len += 1, dass mir dadurch noch das \0 mitkopiert bzw. vom Quellstring "geholt" wird?

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

Verfasst: Fr Jan 27, 2012 12:57 pm
von do6dm
Xin hat geschrieben: Du gibst hier return dest zurück. Der Zeiger zeigt also auch auf dest.

Wenn Du mit Zeigern arbeitest, kannst Du das ändern, auf das Du zeigst. Wenn Du auf Arrays in der main-Funktion zeigst, dann kannst Du diese ändern, richtig.
Also hab ich das jetzt richtig verstanden, wenn ich z.B. ne Funktion hab im Format: char * my_pfusch(.... , ....), dann ist das was ich bei return hinschreib, ein Zeiger, also da steht ne Adresse, in der mein Rückgabewert steht? ... Sorry für die glaub dummen Fragen, aber ich tu mir da noch recht schwer das zu kapieren.

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

Verfasst: Fr Jan 27, 2012 1:19 pm
von cloidnerux
Also hab ich das jetzt richtig verstanden, wenn ich z.B. ne Funktion hab im Format: char * my_pfusch(.... , ....), dann ist das was ich bei return hinschreib, ein Zeiger, also da steht ne Adresse, in der mein Rückgabewert steht? ... Sorry für die glaub dummen Fragen, aber ich tu mir da noch recht schwer das zu kapieren.
Nein.
Also, das ganze ist so:
Du Definierst eine Funktion Folgendermaßen:

Code: Alles auswählen

<Rückgabetyp> Name(#evt Parameter#)
In deinem fall:

Code: Alles auswählen

char * my_strcpy(char *dest, const char *src);
Wie du sehen kannst, ist der Rückgabetyp DEINER Funktion ein Pointer auf einen char.
Daher musst du auch einen Pointer auf einen Char zurückgeben. Und wie du eben schon gelernt hast, ist ein Text in Anführungszeichen nichts anderes als ein Array und der Compiler behandelt eine solche Verwendung eines Arrays als Pointer auf der erste Element im Array, das nun aus chars besteht.
Würdest du stattdessen eine zahl eintragen, würdest du Fehlermeldungen bekommen.


MfG cloidernux