char * my_strcpy... was bedeuted das?

Schnelle objektorientierte, kompilierende Programmiersprache.
do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

char * my_strcpy... was bedeuted das?

Beitrag von do6dm » Fr Jan 27, 2012 9:17 am

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!

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 10:44 am

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.
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 » Fr Jan 27, 2012 12:00 pm

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?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Fr Jan 27, 2012 12:13 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

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

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

Beitrag von do6dm » Fr Jan 27, 2012 12:31 pm

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?

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 12:33 pm

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. :-)
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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Fr Jan 27, 2012 12:34 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

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

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

Beitrag von do6dm » Fr Jan 27, 2012 12:52 pm

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?

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

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

Beitrag von do6dm » Fr Jan 27, 2012 12:57 pm

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Fr Jan 27, 2012 1:19 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten