【发布时间】:2017-04-10 06:13:07
【问题描述】:
我已经开始在大学学习 C。教授给了我们一个任务——编写一个程序来计算另一个 C 程序中 cmets 的数量。我们还没有谈到使用文件进行操作。我找到了一个类似的解决方案 - C Program to count comment lines (// and /* */) 。稍微修改了一下,它确实有效,但我无法理解 enum 的东西。试图在没有枚举的情况下重写它但没有成功(因为我们必须解释如何编程工作)。我的问题是 - 有没有办法在没有枚举的情况下解决它?
#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 表示各州应该可以正常工作。另外,您确定不必使其不是字符串中的 cmets 吗? (看起来这会将“//不是评论”算作评论)。
-
@Lupe 测试了代码并且工作正常。但我正在尝试寻找另一种方法来做到这一点。
-
@Lupe PS:其实你是写的。 “//不是评论”被视为评论。不管怎样,还是得找个替代品。
-
这不是微不足道的:字符串文字可能包含转义的
\",它 not 标记了字符串的结尾。正如评论可能包含"。 -
这是使用称为“状态机”的模式编写的。 “枚举的东西”只是状态的象征性名称。
标签: c file file-io comments enumeration