C-Programm Anzahl Kommentarzeilen (// und /* */)
Ich brauche ein Programm zum zählen der Zeilen ein .txt-oder .c-Datei und kehren Sie mir die folgenden Dinge:
Datei:
Einfache Bemerkung: N-Linien
Mehrzeiliger Kommentar: N-Linien
Total Zeilen: N Zeilen
Habe ich dieses:
if (pFile != NULL)
{
do {
c = fgetc(pFile);
if (c == '\n') n++;
} while (c != EOF);
Und ich weiß nicht, wie zu implementieren, der rest von ihm.
Ich habe versucht, mit der strstr () - Funktion als gut, habe nicht bekommen, weder.
- das ist ein job für perl, c nicht.
- Der beste Weg, dies zu tun ist, schreiben Sie einen parser, kann es nicht ganz korrekt mit nur Charakter-Prüfung.
- Sie müssen schreiben Sie einen parser basierend auf der c-standard (nur die ersten paar übersetzungen Phasen. andernfalls werden Sie verbringen endlose Zeit aufspüren von Fällen wie "dies sind die Kommentar-delims /* // */". Auch trigraphs-und line-Fortsetzungen sind nicht dein Freund.
- Dies kann ein schwieriges problem, abhängig von einer Reihe von Dingen, die Sie brauchen, um Spur zu halten, beim Lesen 1)
// to EOL
Kommentare, 2)/* to */
Kommentare 3)"..."
text, um zu wissen, Kommentare können nicht starten 4)'...'
char-Konstanten, um zu wissen, Kommentare können nicht starten Sie entweder 5) Angenommen, Sie #include-Dateien sind gut erzogen (nicht am Ende in einem offenen Kommentar, zitiert string, etc). 6) Andere gepostet trigraphs, Digraphen, die nicht-ASCII-Zeichen. Andere als, dass, Sie ein Stück Kuchen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Sie eine state machine, die behandeln soll, die meisten Fällen.
Beim Scannen der Datei, werden Sie in einem der folgenden Staaten:
/
, die möglicherweise den start eines single - oder multi-line-Kommentar. Wenn das nächste Zeichen ein/
sind, gehen Sie in die SINGLE_COMMENT Zustand. Wenn das nächste Zeichen ein*
sind, gehen Sie in die MULTI_COMMENT Zustand. Für jeden anderen Charakter, gehen Sie zurück in den TEXT Stand.//
token; Sie bleiben in diesem Zustand, bis ein newline-Zeichen; sobald Sie sehen, das neue-Zeile-Zeichen, das Ihnen erhöhen Sie die Anzahl von single-line-Kommentare sowie insgesamt Linien, und gehen Sie zurück zu dem TEXT Stand./*
token; Sie bleiben in diesem Zustand, bis Sie das nächste*/
token. Alle neue-Zeile-sehen Sie in diesem Zustand verursachen die multi-comment-Zeile-Zähler werden erhöht, zusammen mit der gesamten Zeilen.*
. Wenn das nächste Zeichen/
sind, gehen Sie zurück zu dem TEXT Stand. Wenn das nächste Zeichen*
, wohnen Sie in der SAW_STAR Zustand. Ansonsten gehen Sie zurück zu der MULTI_COMMENT Zustand.Gibt es Grenzfälle, dass ich mich nicht um (wie die Begegnung mit einer EOF-während in einem Kommentar Stand), aber das folgende sollte ein vernünftiger Beispiel, wie Sie tun Sachen wie diese.
Beachten Sie, dass verschachtelte Kommentare nicht gezählt werden; d.h., wenn ein
//
getrennte Kommentar erscheint in einer/* */
getrennten Kommentar, nur der multi-Kommentar-counter aktualisiert werden.Werden Sie wahrscheinlich wollen, um den Faktor der zähl-Logik in eine eigene Funktion; nur versuchen, um das Beispiel so einfach, wie ich kann.
BEARBEITEN
Hier ist ein Tisch-driven-äquivalent zu dem oben genannten Programm. Ich erstelle ein
state
Tabelle zu Steuern, Staatliche übergänge und einenaction
Tabelle zu kontrollieren, was passiert, wenn ich den Status ändern.Ausführen der Datei auf sich selbst gibt uns
die ich für richtig halte. Dieser hat alle die gleichen Schwächen wie die erste version, nur in einer anderen form.
switch
Anweisungen und verwenden Sie eine Tabelle-driven-Ansatz.Also n = = Anzahl der Zeilen in der Datei.
Benötigen Sie eine weitere variable, die zählt, jedes mal, wenn Sie sehen, das Zeichen/, gefolgt von einem /(das ist einfach, die gleiche Weise, die Sie tun, n++ im Grunde auch, aber es sollte so Aussehen
Dann für mehrzeilige Kommentare, die Sie tun die gleiche Sache, und nur count /, genau wie oben. Sie müssen nur halten Sie ein Auge auf, wenn n wird inkrementiert (jede Zeile) und die andere diejenigen bekommen, erhöht (Einmal für jede Zeile, die mit //und einmal für jede Zeile, die mit / und, bis Sie auf a */).