2016-11-25 5 views
0

Ich habe angefangen, C in der Universität zu studieren. Der Professor gab uns eine Aufgabe - ein Programm zu schreiben, das die Anzahl der Kommentare in einem anderen C-Programm zählt. Wir haben immer noch nicht über die Verwendung von Dateien gesprochen. Ich fand eine ähnliche Lösung - C Program to count comment lines (// and /* */). Modifiziert es ein bisschen und es funktioniert tatsächlich, aber ich kann die enum Sachen nicht verstehen. Versucht, es ohne Aufzählungen umzuschreiben, aber ohne Erfolg (weil wir erklären müssen, wie man programmiert). Meine Frage ist - gibt es eine Möglichkeit, es ohne Aufzählungen zu lösen?Zählen Sie die Anzahl der Kommentare in einem C-Programm

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

int main(int argc, char **argv) { 

FILE *fp; 
int c, i=0; 
char ch; 
char path[150]; 

unsigned int chars = 0; 
unsigned int multi = 0; 
unsigned int single = 0; 

enum states { TEXT, 
    SAW_SLASH, 
    SAW_STAR, 
    SINGLE_COMMENT, 
    MULTI_COMMENT } state = TEXT; 

printf("Write file's path. Separate the folders with TWO back slashes (\\)\n"); 
scanf("%s", &path); 

fp = fopen(path, "r"); 
if (!fp) 
{ 
    fprintf(stderr, "Cannot open file %s\n", argv[1]); 
} 
else { 
    while((c=fgetc(fp)) != EOF){ 

    switch(state) { 
     case TEXT : 
     switch(c) 
     { 
      case '/' : state = SAW_SLASH; break; 
      default : break; 
     } 
     break; 
     case SAW_SLASH : 
      switch(c) 
      { 
       case '/' : 
        printf("case SLASH case/\n"); 
        state = SINGLE_COMMENT; 
        break; 
       case '*' : 
        printf("case SLASH case * \n"); 
        state = MULTI_COMMENT; 
        break; 
       default : 
        state = TEXT; 
        break; 
      } 
      break; 
     case SAW_STAR : 
      switch(c) 
      { 
       case '/' : 
        printf("case STAR case/\n"); 
        state = TEXT; 
        multi++; 
        break; 
       case '*' : 
        break; 
       case '\n' : 
        printf("case SLASH case 'NEW LINE' \n"); 
        multi++; // fall through 
       default : 
        state = MULTI_COMMENT; 
        break; 
      } 
      break; 
     case SINGLE_COMMENT : 
      switch(c) 
      { 
       case '\n' : 
        printf("case SINGLE case NEW LINE \n"); 
        state = TEXT; 
        single++; // fall through 
       default : 
        break; 
      } 
      break; 
     case MULTI_COMMENT : 
      switch(c) 
      { 
       case '*' : 
        printf("case MULTI case * \n"); 
        state = SAW_STAR; 
        break; 
       case '\n' : 
       break; 
       default : 
        break; 
      } 
      break; 

     default: // NOT REACHABLE 
      break; 
     } 
    } 
    fclose(fp); 
    printf("File     : %s\n", argv[1]); 
    printf("Single-comment: %8u\n", single); 
    printf("Multi-comment: %8u\n", multi); 

} 
return 0; 
} 
+2

Ich habe es nicht gelesen vorsichtig aber enums haben wirklich nichts damit zu tun. Ich denke nicht unbedingt, dass du die Aufgabe richtig machst, aber die Verwendung von #define für die Staaten sollte genauso funktionieren. Sind Sie sicher, dass Sie nicht Kommentare in Strings machen müssen? (Es sieht so aus, als würde dies "// kein Kommentar" als Kommentar zählen). – Lupe

+0

@Lupe Getestet den Code und funktioniert gut. Aber ich versuche einen alternativen Weg zu finden. – Alex

+0

@Lupe PS: Eigentlich schreibst du. "// kein Kommentar" gilt als Kommentar. Wie auch immer, muss immer noch eine Alternative finden. – Alex

Antwort

0

Seit Enum zu einem Bündel von #define ‚s entspricht, können Sie diesen Teil des Codes ersetzt werden:

enum states { 
    TEXT, 
    SAW_SLASH, 
    SAW_STAR, 
    SINGLE_COMMENT, 
    MULTI_COMMENT 
} state = TEXT; 

mit:

#define TEXT   0 
#define SAW_SLASH  1 
#define SAW_STAR  2 
#define SINGLE_COMMENT 3 
#define MULTI_COMMENT 4 

int state = TEXT; 
Verwandte Themen