【问题标题】:Count the number of comments in a C program计算 C 程序中的注释数
【发布时间】: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


【解决方案1】:

由于 enum 相当于一堆 #define ,所以可以替换这部分代码:

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;

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2018-04-24
    • 2020-12-18
    • 2014-08-27
    • 2018-10-16
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多