2017-01-29 2 views
1

Ich habe Code geschrieben Kommentare von einer C-Programm-Datei zu entfernen, und die Ausgabe auf der Konsole aus:Entfernen Kommentare aus einer Datei und druckt auf Konsole

#include <stdio.h> 
#include <stdlib.h> 

void incomment(FILE *fp); 
void rcomment(int c, FILE *fp); 
void echo_quote(int c, FILE *fp); 

int main() { 
    FILE *fp; 
    fp = fopen("temp.c", "r"); 
    int c; 

    while ((c = getc(fp)) != EOF) { 
     rcomment(c, fp); 
    } 
    return 0; 
} 

void incomment(FILE* fp) { 
    int c, d; 
    c = getc(fp); 
    d = getc(fp); 
    while (c != '*' && d != '/') { 
     c = d; 
     d = getc(fp); 
    } 
} 

void echo_quote(int c, FILE *fp) { 
    int d; 
    putchar(c); 
    while ((d = getc(fp)) != c) { 
     putchar(d); 
     if (d == '\\') 
      putchar(getc(fp)); 
    } 
    putchar(d); 
} 

void rcomment(int c, FILE *fp) { 
    int d; 

    if (c == '/') { 
     if ((d = getc(fp)) == '*') 
      incomment(fp); 
     else 
     if (d == '/') { 
      putchar(c); 
      rcomment(d, fp); 
     } else { 
      putchar(c); 
      putchar(d); 
     } 
    } else 
    if (c == '\'' || c == '"') 
     echo_quote(c, fp); 
    else 
     putchar(c); 
} 

jedoch für die folgende Eingabe:

#include<stdio.h> 
/* Author : XYZ 
* Date : 21/1/2016 
*/ 
int main() 
{ 
int a; ///variable a 
printf("/*Hi*/"); 
return 0; 
} 

OUTPUT:

#include<stdio.h> 
Date : 21/1/2016 
*/ 
int main() 
{ 
int a; ///variable a 
printf("/*Hi*/"); 
return 0; 
} 

Könnte jemand den Fehler im Code hinweisen. Es scheint gut zu funktionieren für Kommentare in Anführungszeichen. Aber nicht für die einzeiligen Kommentare.

+0

„Könnte jemand den Fehler im Code hinweisen“. Verwenden Sie einen Debugger, um das herauszufinden. Den Debugger zu benutzen, wird Ihre Zeit wert sein und für Sie nützlicher sein als jemand, der es nur für Sie debuggt. – kaylum

+0

Seitenknoten: Schreiben Sie niemals ein Datum in diesem Format. Dies kann falsch gelesen werden, ist der Tag weniger als 32, besser verwenden Sie ISO8601. – 12431234123412341234123

Antwort

1

Die rcomment() Funktion analysiert nicht die einzige Zeile kommentiert richtig:

  • Wenn Sie ein '/' für das zweite Zeichen übereinstimmen, sollten Sie alle verbleibenden Zeichen bis zu dem Newline und Ausgabe lesen Sie einfach die Newline.

  • Wenn das zweite Zeichen ein Anführungszeichen ist, können Sie das erste Zeichen nicht ausgeben und das Literal nicht analysieren. Eine einfache Möglichkeit, dies zu tun, besteht darin, das zweite Zeichen mit ungetc(d, fp); auszugeben und nur c auszugeben.

Es gibt noch andere Sonderfälle Sie nicht behandeln:

  • Entkommen Zeilenumbrüche sollten in Literale und einzeiligen Kommentaren sowie zwischen den / und den * zu Beginn eines behandelt werden Multi-Line-Kommentar und zwischen dem * und dem / am Ende. Sie können dies einfach tun, indem Sie eine Dienstprogrammfunktion verwenden, um die Bytes aus der Datei zu lesen, die maskierte Zeilenumbrüche verarbeitet. Es ist jedoch schwierig, sie in die Ausgabedatei zurückzugeben, um die Zeilenanzahl beizubehalten.

  • Sie sollten mehrzeilige Kommentare durch ein Leerzeichen oder Zeilenumbrüche ersetzen, um das Einfügen von Token zu vermeiden und die Zeilenanzahl zu erhalten.

  • incomment() und echo_quote() sollte ein vorzeitiges Ende der Datei behandeln. Wie derzeit codiert, laufen sie unbegrenzt.

Diese Parsing-Aufgabe ist subtiler als es aussieht. Sie könnten einen anderen Ansatz versuchen und eine Zustandsmaschine implementieren.

Hier ist eine schnelle Lösung für die rcomment() Funktion, aber die anderen oben genannten Probleme bleiben:

int peekc(FILE *fp) { 
    int c = getc(fp); 
    if (c != EOF) 
     ungetc(c, fp); 
    return c; 
} 

void rcomment(int c, FILE *fp) { 
    int d; 

    if (c == '/') { 
     if ((d = getc(fp)) == '*') { 
      incomment(fp); 
     } else 
     if (d == '/') { 
      while ((c = getc(fp)) != EOF && c != '\n') { 
       if (c == '\\' && peekc(fp) == '\n') { 
        putchar(getc(fp)); 
       } 
      } 
      putchar('\n'); 
     } else { 
      putchar(c); 
      ungetc(d, fp); 
     } 
    } else 
    if (c == '\'' || c == '"') { 
     echo_quote(c, fp); 
    } else { 
     putchar(c); 
    } 
} 
Verwandte Themen