Anzeige:
Ergebnis 1 bis 5 von 5

Thema: C Frage zu Code schnippsel

  1. #1
    Registrierter Benutzer
    Registriert seit
    06.07.2004
    Beiträge
    1

    C Frage zu Code schnippsel

    Hallo,

    kann mir vielleicht jemand helfen diesen Code zu verstehn, und ob es Sinnmacht break in einer if Bedinung zu verwenden. Danke


    Code:
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    breaks können in if Anweisungen verwendet werden, probiere es doch einmal aus. Der Quellcode ergibt so wie er jetzt ist, aber keinen Sinn.
    Geändert von dml (02-02-2013 um 10:23 Uhr)

  3. #3
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von destrukt Beitrag anzeigen
    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:
    Code:
    unsigned int str_copy(char *out,const char *in) {
      char *s = out;
      for (;;) {
        if (!(*s=*in)) break; ++s; ++in;
      }
      return s-out;
    }
    oder
    Code:
    unsigned int str_copy(char *out,const char *in) {
      char *s = out;
      while ( (*s=*in) != '\0' ) {
        ++s; ++in;
      }
      return s-out;
    }
    oder eben
    Code:
    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.
    Geändert von sommerfee (02-02-2013 um 10:26 Uhr) Grund: Historische Abhandlung hinzugefügt

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Tzzz, tzz, tzz, und so etwas am Samstag morgen, sonnerfee.

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.03.2013
    Ort
    Dortmund-Wickede
    Beiträge
    4
    Hallo!

    *out und *in sind die char-Zeiger die auf die Zeichenketten zeigen.
    In der Funktion gibts dann zwei Pointer, die beide Arrays durchlaufen

    Code:
    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
    }
    Geändert von Monadic512 (25-03-2013 um 11:17 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •