2016-11-25 2 views
0

Я начал изучать C в университете. Профессор дал нам задачу - написать программу, которая подсчитывает количество комментариев в другой программе на C. Мы все еще не говорили о работе с файлами. Я нашел аналогичное решение - C Program to count comment lines (// and /* */). Немного изменил его, и он действительно работает, но я не могу понять вещи enum. Пытался переписать его без перечислений, но без успеха (потому что мы должны объяснить, как программировать работы). Мой вопрос: есть ли способ решить его без перечислений?Подсчитайте количество комментариев в программе C

#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

Я не читал его но переписки действительно не имеют к этому никакого отношения. Я не обязательно думаю, что вы правильно выполняете задание, но использование #define для состояний должно работать одинаково. Кроме того, вы уверены, что вам не нужно делать это не в комментариях в строках? (Похоже, что это будет считать «// не комментарий» в качестве комментария). – Lupe

+0

@ Lupe Протестировал код и отлично работает. Но я пытаюсь найти альтернативный способ сделать это. – Alex

+0

@ Lupe PS: На самом деле вы пишете. «// не комментарий» считается комментарием. Во всяком случае, еще нужно найти альтернативу. – Alex

ответ

0

Поскольку перечисление эквивалентно связкой #define «s, вы можете заменить эту часть кода:

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

с:

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

int state = TEXT; 
Смежные вопросы