Funktion, die Kommentare aus Code entfernt - Codestil in Ordnung?



  • Ich habe gerade versucht eine Funktion zu schreiben, die aus einem Programmtext C-Style Kommentare entfernt (eine Aufgabe aus dem K&R C-Buch). Ich nehme dabei an, dass das Programm stynaktisch korrekt ist, d.h. für jedes /* gibt es irgendwo ein */.

    Der Programmtext wird in 's' übergeben und der Programmtext ohne Kommentare in 't' gespeichert.

    void remove_comments_1(char s[], char t[])
    {
        int i, j;
    
        i = j = 0;
        while ( s[i] != '\0')
        {
            if ( s[i] == '/' && s[i+1] == '/' )
                for ( i += 2;  s[i] != '\n' && s[i] != '\0'; ++i ) {}
            if ( s[i] == '/' && s[i+1] == '*' )
            {
                for ( i += 2; s[i] != '*' || s[i+1] != '/'; ++i ) {}
                i += 2;
            }
            else
                t[j++] = s[i++];
        }
        t[j] = '\0';
    }
    
    void remove_comments_2(char s[], char t[])
    {
        while (*s != '\0')
        {
            if ( *s == '/' && *(s+1) == '/' )
                for ( s += 2; *s != '\n' && *s != '\0'; ++s ) {}
            if ( *s == '/' && *(s+1) == '*' )
            {
                for ( s += 2; *s != '*' || *(s+1) != '/'; ++s ) {}
                s += 2;
            }
            else
                *(t++) = *(s++);
        }
        *t = '\0';
    }
    

    Ist das so in Ordnung (welche der beiden Versionen ist besser)? Was würdet ihr anders machen bzw. was kann man daran verbessern?



  • Ich denke K&R würden mit Ein/Ausgabe über stdin und stdout arbeiten.

    Zudem fehlt die Betrachtung von Strings.

    puts("/* Dies ist kein Kommentar */"); /* Dies schon */
    

    http://www.c-program-example.com/2011/11/k-r-c-programs-exercise-1-23.html
    obwohl auch dort ein Fehler in Zeile 35 ist.



  • Du könntest noch ein const für s spendieren.

    *(t++) = *(s++);
    

    schreibt man auch kürzer

    *t++ = *s++;
    

    Ob die Array oder Zeigervariante "besser" ist, ist Geschmackssache.



  • @ DirkB
    Du hast recht, diesen Fall habe ich wirklich vergessen. Thx für den Link.

    @ Wutz
    Ja, da gehört wirklich ein const hin. Ich hatte die Operator Precedences falsch im Kopf, danke für den Hinweis.

    Thx für eure Rückmeldungen!



  • Bez. Style, ich würde lieber

    void remove_comments_1(const char * s, const char *t)
    ...
    
    uint32_t    i = 0,// ist doch unsigned!
                j = 0;
    

    aber dann als Array zugreifen.

    Bez. Methode, den Algo ist schrott. Zerleg die Aufgabe auf:

    1. // Kommentare markieren
    2. // Kommentare entfernen. Dabei kannst du die Daten mit Blöcke
      kopieren mit memcpy oder irgendwas und nicht bitweise was ist voll schrott.
    3. /* Kommentare markieren , dabei kannste checken ob es keine Fehler geben
    4. /* Kommentare entfernen

    Die Länge von t ist am Anfang unklar, aber du machst keine Allocationen in
    der Methode. Wenn du länge t gleich länge von s hast und viele Kommentare hast,

    haste: "string\0 .......... X kb platz verschwendet"
    Ales Klar?

    Schönen Zeitpunkt. 🕶



  • Die Frage als solche ist unsinninig! 😞 Jeder Anfänger lernt, zur besseren Lesbarkeit des Source-Codes Kommentare einzufügen. Wozu diese dann entfernen wollen? 😕



  • berniebutt schrieb:

    Die Frage als solche ist unsinninig! 😞 Jeder Anfänger lernt, zur besseren Lesbarkeit des Source-Codes Kommentare einzufügen. Wozu diese dann entfernen wollen? 😕

    das ist eine übungsaufgabe 🙄


  • Mod

    berniebutt schrieb:

    Die Frage als solche ist unsinninig! 😞 Jeder Anfänger lernt, zur besseren Lesbarkeit des Source-Codes Kommentare einzufügen. Wozu diese dann entfernen wollen? 😕

    Zum Beispiel, um einen C-Präprozessor zu schreiben.



  • Ein Compiler entfernt die Kommentare bei der lexikalischen Analyse, das ganze ist also nicht nur eine theoretische Übung, da Compiler ja auch mal irgendwann geschrieben werden müssen. Natürlich nicht von berniebutt.



  • Bashar schrieb:

    Ein Compiler entfernt die Kommentare bei der lexikalischen Analyse, das ganze ist also nicht nur eine theoretische Übung, da Compiler ja auch mal irgendwann geschrieben werden müssen. Natürlich nicht von berniebutt.

    😃 Sonnst hätte man die Kommentare auch noch in der Binarie



  • lesen will gelernt sein schrieb:

    das ist eine übungsaufgabe 🙄

    Und man kann sie gleich auf die eigenen Programme anwenden.
    Da braucht man nicht erst Testdaten erstellen. 🤡



  • sadop schrieb:

    😃 Sonnst hätte man die Kommentare auch noch in der Binarie

    So witzig ist das gar nicht. Bei manchen "Compilern" im weitesten Sinne wie vielleicht Refaktorisierungs-, Navigations- oder Dokumentationstools muss der Code geparst und verstanden werden und dabei die Kommentare intakt bleiben. Ein Compiler im engeren Sinne hats da schön einfach, der schmeißt sie sobald möglich raus.



  • Schreibk kein Flood hier bitte.

    Ja noch eine Sache mit Strings die es komplitierter machen, z.B. ein String

    printf(" blabla\" /* dies soll nicht entfernt werden! \" */... ");
    

    So könnte es aush stehen also Vorsicht!
    Ja und wenn deine Mehtode vertig ist, schreib hier, ich werde es benötigen weil ich einen Obfuscator/Deobfuscator schreibe 😃



  • o4kareg schrieb:

    Schreibk kein Flood hier bitte.

    Ja noch eine Sache mit Strings die es komplitierter machen, z.B. ein String

    printf(" blabla\" /* dies soll nicht entfernt werden! \" */... ");
    

    So könnte es aush stehen also Vorsicht!
    Ja und wenn deine Mehtode vertig ist, schreib hier, ich werde es benötigen weil ich einen Obfuscator/Deobfuscator schreibe 😃

    Dann doch aber bitte nur beim C-Code und nicht beim deutschen Text.


Anmelden zum Antworten