Kann mir das bitte mal einer erklären
-
Hallo Zusammen,
ich habe hier einen Code vorliegen, habe aber Probleme zu verstehen wie es genau arbeitet.
Es geht dabei um einen Code der in einem anderen Code, die Kommentare sucht und entfernt sowie den Code als einen Fliesstext ausgibt.
Es wäre nett wenn mir mal jemand erklären könnte, wie es genau arbeitet und was für ein Idee dahintersteckt.char *first = text; while( ( first = strstr( first, "//" ) ) ) { char *remove = first; if( first != text ) { if( *( first - 1 ) == '\n' ) { --first; } } while( ( *remove != '\n' ) && ( *remove != '\0' ) ) { ++remove; } strcpy( first, remove ); } first = text; while( ( first = strstr( first, "/*" ) ) ) { char *remove = strstr( first, "*/" ); if( !remove ) { printf( "Compouned statement \"*/\" missing!" ); break; } strcpy( first, remove + 2 ); } first = text; while( *first ) { if( *first == '\n' ) { *first = ' '; } ++first; } first = text; while( *first ) { for( char *i = first; isspace( *i ); ++i ){ if( ( i - first ) > 1 ) { strcpy( first, i ); first = i; } else { first++; } }
Gruesse
-
Hehe, das ist mein Code...
char *first = text; // text zeigt auf den Text, welcher // von Kommentaren gesäubert werden // soll. first zeigt nun auf das // erste Zeichen. while( ( first = strstr( first, "//" ) ) ) { // strstr( ) gibt uns einen Zeiger zurück, welcher auf die // Stelle im Text zeigt, an welcher "//" gefunden wurde. // Sie gibt 0 zurück, falls "//" nicht gefunden wurde. In // diesem Falle wird die Schleife nicht (mehr) ausgeführt, // da 0 ^= false. char *remove = first; if( first != text ) { // Wir stellen sicher, dass first nicht auf text zeigt, // da sonst im nächsten if( ) mit *( first - 1 ) eine // Speicherschutzverletzung auftreten könnte. if( *( first - 1 ) == '\n' ) { // hier Prüfen wir, ob das Zeichen vor "//" zufällig ein // Newline ist. Ist dem so, so entfernen wir es gleich mit. --first; } } while( ( *remove != '\n' ) && ( *remove != '\0' ) ) { // Wir erhöhen remove so lange wir in der selben Zeile // ( *remove != '\n' ) und wir noch innerhalb von text // ( *remove != '\0' ) sind. ++remove; } strcpy( first, remove ); // Wir kopieren die Zeichenkette an der Position von // remove bis Ende an die Position first und über- // schreiben damit ein eventuell vorhandenes '\n' die // Kommentareinleitung "//" und den darauf folgenden // Text bis Zeilenende ('\n') oder Textende ('\0'). } first = text; while( ( first = strstr( first, "/*" ) ) ) { // Selbes spielchen wie oben char *remove = strstr( first, "*/" ); // Wir suchen nach der Kennzeichnung für das Ende des // Kommentars "*/" if( !remove ) { // Wird die Zeichenfolge nicht gefunden, brechen wir ab: printf( "Compouned statement \"*/\" missing!" ); break; } // Gleiches überschreiben wie oben. strcpy( first, remove + 2 ); } first = text; while( *first ) { // für jedes Newline-Zeichen in text machen wir: if( *first == '\n' ) { *first = ' '; // und ersetzten es durch ' '. } ++first; } first = text; while( *first ) { // wir laufen mit first durch den Text und // mit i solage es ein Leerzeichen (oder Tab) ist: for( char *i = first; isspace( *i ); ++i ) { if( ( i - first ) > 1 ) { // falls wir 2 Leerzeichen gefunden haben, so // überschreiben wir sie wie gehabt: strcpy( first, i ); first = i; // und suchen weiter... } else { first++; } }
Falls es noch Unklarheiten geben sollte brauchst du nur zu Fragen.
Greetz, Swordfish
-
Swordfish Du bist der Beste man, danke Dir vielmals....