Archiv verlassen und diese Seite im Standarddesign anzeigen : C Frage zu Code schnippsel
destrukt
01-02-2013, 19:28
Hallo,
kann mir vielleicht jemand helfen diesen Code zu verstehn, und ob es Sinnmacht break in einer if Bedinung zu verwenden. Danke
unsigned int str_copy(char *out,const char *in) {
register char* s=out;
register const char* t=in;
for (;;) {
if (!(*s=*t)) break; ++s; ++t;
if (!(*s=*t)) break; ++s; ++t;
if (!(*s=*t)) break; ++s; ++t;
if (!(*s=*t)) break; ++s; ++t;
}
return s-out;
}
Mfg
breaks können in if Anweisungen verwendet werden, probiere es doch einmal aus. Der Quellcode ergibt so wie er jetzt ist, aber keinen Sinn.
sommerfee
02-02-2013, 09:18
kann mir vielleicht jemand helfen diesen Code zu verstehn
Der Code kopiert eine Zeichenkette -- genau wie strcpy() -- gibt aber im Gegensatz zu strcpy() die Länge der kopierten Zeichenkette, also strlen(), zurück.
Er ist ein wenig "historisch" geschrieben [1], und ist in seiner Funktionalität (aber nicht in seinem Laufzeitverhalten) identisch mit:
unsigned int str_copy(char *out,const char *in) {
char *s = out;
for (;;) {
if (!(*s=*in)) break; ++s; ++in;
}
return s-out;
}
oder
unsigned int str_copy(char *out,const char *in) {
char *s = out;
while ( (*s=*in) != '\0' ) {
++s; ++in;
}
return s-out;
}
oder eben
unsigned int str_copy(char *out,const char *in) {
return strlen( strcpy( out, in ) );
}
und ob es Sinnmacht break in einer if Bedinung zu verwenden.
Warum sollte das keinen Sinn ergeben? Das "break" bezieht sich doch auf die "for"-Schleife (und ist keinesfalls in der "if"-Bedingung platziert, sondern in dem Code danach).
[1] Durch die Anweisung "register" an den Compiler, nach Möglichkeit Prozessorregister für die Variablen zu verwenden, und durch die vierfache Wiederholung der inneren Anweisung wurde versucht, das Laufzeitverhalten zu verbessern. Zu uralten Zeiten hat das auch noch was gebracht, wenn diese Funktion sehr häufig aufgerufen worden ist, heutzutage ist das für Anfänger verwirrend, aber nicht mehr hilfreich, zumal die C-Compiler heutzutage selber Code-Optimierungen durchführen.
Tzzz, tzz, tzz, und so etwas am Samstag morgen, sonnerfee. ;)
Monadic512
24-03-2013, 18:57
Hallo!
*out und *in sind die char-Zeiger die auf die Zeichenketten zeigen.
In der Funktion gibts dann zwei Pointer, die beide Arrays durchlaufen
unsigned int str_copy(char *out,const char *in) {
register char* s=out; // der Pointer "s" durchläuft das Array "out"
register const char* t=in; // der Pointer "t" durchäluft das Array "in"
for (;;) { // Endlosschleife: bricht erst ab, wenn es ein
// break gibt
if (!(*s=*t)) break; ++s; ++t;
// Der Inhalt von s wird auf den Inhalt von t gesetzt, d.h. t wird stückweise in s kopiert.
// Wenn es dabei einen Fehler gibt, wird mit "break aus der for-Schleife gesprungen
// Ansonsten werden s und t um 1 erhöht und zeigen auf den nächsten Buchstaben im String
if (!(*s=*t)) break; ++s; ++t; // unnötig, da es eh wiederholt wird
if (!(*s=*t)) break; ++s; ++t;
if (!(*s=*t)) break; ++s; ++t;
}
return s-out; // Position von Zeiger "s" MINUS Position von "out"
// entspricht der Länge des Wortes
}
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.