Я начал изучать 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;
}
Я не читал его но переписки действительно не имеют к этому никакого отношения. Я не обязательно думаю, что вы правильно выполняете задание, но использование #define для состояний должно работать одинаково. Кроме того, вы уверены, что вам не нужно делать это не в комментариях в строках? (Похоже, что это будет считать «// не комментарий» в качестве комментария). – Lupe
@ Lupe Протестировал код и отлично работает. Но я пытаюсь найти альтернативный способ сделать это. – Alex
@ Lupe PS: На самом деле вы пишете. «// не комментарий» считается комментарием. Во всяком случае, еще нужно найти альтернативу. – Alex