STRCPY macht was genau?
-
aber warum funktioniert das??
#include <stdio.h> #include <stdlib.h> main() { char kette1[80]; tausche(kette1); return 0; } void a (char *STRING1) { char ICHKRIEGEESAUCH[80]; strcpy (ICHKRIEGEESAUCH,STRING1); } das prog hat keinen sinn, es kopiert nur einen string in eine in der funktion a neu erstellten variable. aver dort wird doch nur dann die adresse von STRING1[0] kopiert oder???
-
was dein proggie macht ist schwer zu sagen du rufst ja a gar nicht in main auf sondern eine funktion dessen implementation du uns ja verschwiegen hast
wie Bashar schon sagte werden hier nicht die adressen kopiert sondern der inhalt auf den pointer1 zeigt in den speicherbreich von pointer2...
du musst halt unterscheiden zwischen einer normalen variable und einem pointer der auf einen speicherbereich zeigtdein strcpy funktioniert in etwa so...
void mystrcpy(char *s1,char *s2){ int i; for(i=0;s1[i]!=0;++i)s2[i]=s1[i]; s2[i]=0; }
wenn man das ein wenig schlauer mit pointer macht so
void mystrcpy(char *s1,char *s2){while(*s2++=*s1++);}
-
Ein String in C hat eine etwas andere Definiton es ist ein zusammenhängender linear aufsteigender Speicherbereich der durch eine \0 beendet wird.
Somit nimmt sich strcpy den Pointer uaf das Element 0 und kopiert solange bis es ein \0 findet.
-
Ein string ist ein Feld vom Typ char.
Wenn du nur den Variablennamen einer anderen Variablen zuweist, übergibst du die Anfangsadresse von der Variablen.Also gibst Du die Anfangsadr src und dest an, den Rest erledigt das \0
-
also um es nochmal zu verdeutlichen,
wenn ich strcpy(kette1,kette2) schreibe, wird praktisch zur adresse der ersten stelle von kette 2 gegangen, alles kopiert bis zur ersten \0, und komplett in kette1 reingeschrieben. richtig???
-
@Bunti sachlich richtig
Simpleste Implementierung zur Verdeutlichung
int Doofes_StrCopy(char *in,char* out) { int i; int len=strlen(in); for(i=0;i<=len;i++) out[i]=in[i] return 0; }
Und bevor irgendeiner anfängt darüber zu diskutieren wieviel Probleme diese Implementierung macht
es ist nur ein simples Beispiel.Korrektur 1 for Schleife von < nach <= geändert
Korrektur 2 doppeltes strlen entfernt
-
Und bevor irgendeiner anfängt darüber zu diskutieren wieviel Probleme diese Implementierung macht
das nicht aber wir haben das nullbyte am ende vergessen
-
@WINDALF Gracias auch für das wir
wird korrigiert
kommt davon falls ich es schreiben müßte, würde das ganze mit Pointern in einem while verschwinden.
beziehungsweise bei embedded Systemen in Assembler implementiert
-
kommt davon falls ich es schreiben müßte, würde das ganze mit Pointern in einem while verschwinden.
beziehungsweise bei embedded Systemen in Assembler implementiertoben hab ich doch die stroustrup-variante hingeschrieben... würdest du das ganz anders machen oder wie meinst du das jetzt?
-
Hallo,
PAD's Version ist zwar doof (schreibt er ja selber, keine Beleidigung von mir, außerdem sehe ich doppelt hier
int len=strlen(in); len=strlen(in);
und das liegt nicht am heutigen Tag oder meinem Zustand
)
aber es ist korrekt, das Null-Byte wird selbstverständlich erfaßt, man beachte die for-Bedingung:
[cpp]
for(i=0;i<=len;i++)
[/cpp]auch wenn das (vielleicht?) nicht beabsichtigt war...manchmal können scheinbare "Fehler" auch richtig sein
MfG
-
@Probe-Nutzer
er hatt vorher ausversehen (was vermutlich auch an übermässigen alkeholkonsum lag) erst nur < statt <= geschrieben und hats dann nachträglich editiert... so wie es jetzt da steht stimmt es also, musst dir also keine sorgen machen
-
na dann bin ich aber beruhigt jetzt, und jetzt weiß ich auch, warum die Edit-Funktion so tückisch sein kann, wenn man nicht auf die letzte Zeile "bearbeitet von" achtet (worauf ich sonst eigentlich immer achte und mich zurückhalte, so daß dieser Tag wohl doch nicht spurlos an mir vorbeigegangen ist
). Aber ich sehe jetzt wenigstens nicht mehr doppelt, so daß mein Beitrag doch etwas Nützliches beigetragen hat.
MfG
-
das eine kleine funktion so kompliziert sein kann O_o