user-0 提问: c语言统计代码行数，注释行数，空行数，文件总行数

回复:
user: user-1
content: 这作业挺有意思，我折腾了几天，写好又重写，写好又重写......。勉强捣鼓出一个。还特地做了一份测试用的c文件，也贴在后面。当作业交的话应该能合格。 #include <stdio.h> #include <cstdlib> #include <fstream>  /** * 统计c源程序总行数、空行数、代码行数、注释行数。根据当前行 * 中是否包含//、/*和* /来判断是否是注释行，但要忽略注释和 * 字符串常量和字符常量中的这些符号。 * * （2023-4-21. Mr Yao） */  /* * 读取当前字符，且忽略所有非换行空白符。 */ inline int get_cur_char(FILE* fp, int* ch) {     while ((*ch = getc(fp)) && *ch != EOF && *ch != '\n' && isspace(*ch));      if (*ch != EOF) return 1;     else return 0; }  /* * 读取当前字符，包括空白符。 */ inline int get_cur_char_space(FILE* fp, int* ch) {     *ch = getc(fp);     if (*ch != EOF) return 1;     else return 0; }  int main(int argc, char* argv[]) {     FILE* fp = 0;     char filename[100];      /**     * DEFAULT 默认状态。     * STRING 字符串常量状态。     * CHAR 字符常量状态。     * BLOCKCOMMENT 块注释状态。     * LINECOMMENT 行注释状态。     */     enum State { DEFAULT = 0, STRING, CHAR, BLOCKCOMMENT, LINECOMMENT };      State cur_state = DEFAULT;    //当前状态。     /**     * total_lines--总行数，comment_lines--注释行数，blank_lines--空行数，code_lines--代码行数     */     int total_lines = 0, comment_lines = 0, blank_lines = 0, code_lines = 0;     /**     * is_comment_line--标记当前行是否是含有注释，is_code_line--标记当前行是否含有代码，     * is_blank_line--标记当前行是空行     */     int is_comment_line = 0, is_blank_line = 0, is_code_line = 0;      int cur_char = DEFAULT;    //当前待分析字符。      if(argc > 1)         fopen_s(&fp, argv[1], "r");      while (fp == 0) {         printf("Failed to open file.\n");         printf("Please input file name:");         scanf_s("%s", filename, 100);         fopen_s(&fp, filename, "r");     }      while (get_cur_char(fp, &cur_char)) {         //开始新行。         is_comment_line = 0; is_code_line = 0; is_blank_line = 0;         if (cur_char == '\n') is_blank_line = 1; //空行         else {             do {                 switch (cur_char)                 {                 case '\n':        //换行则关闭行注释状态                     if (cur_state == LINECOMMENT)                         cur_state = DEFAULT;                     break;                 case '\\':        //忽略转义字符                     if (cur_state != BLOCKCOMMENT) {                         get_cur_char_space(fp, &cur_char);                         if (cur_char == '\n') {                             if(cur_state != LINECOMMENT)is_code_line = 1;                             else is_comment_line = 1;                         }                     }                     break;                 case '/':        //在默认状态下，判断下一个字符                     if (cur_state == DEFAULT) {                         if (get_cur_char_space(fp, &cur_char) && cur_char == '*') {                             //找到块注释，标记该行为注释行，转换成块注释状态                             is_comment_line = 1;                             cur_state = BLOCKCOMMENT;                             break;                         }                         else if (cur_char == '/') {                             //找到行注释，标记该行是注释行，转换成行注释状态                             is_comment_line = 1;                             cur_state = LINECOMMENT;                             break;                         }                         is_code_line = 1;                     }                     break;                 case '*':    //在块注释状态下，找* /                     if (cur_state == BLOCKCOMMENT) {                         is_comment_line = 1;                         while (cur_char == '*') {                             get_cur_char_space(fp, &cur_char);                         }                         if (cur_char == '/') {                             //找到，转换成默认状态                             cur_state = DEFAULT;                         }                     }                     break;                 case '"':    //默认状态下，转换成字符串状态，字符串状态下转换成默认状态                     if (cur_state == DEFAULT || cur_state == STRING) {                         cur_state = (State)((int)cur_state ^ (int)STRING);                         is_code_line = 1;                     }                     break;                 case '\'':    //默认状态下，转换成字符状态，字符状态下转换成默认状态                     if (cur_state == DEFAULT || cur_state == CHAR) {                         cur_state = (State)((int)cur_state ^ (int)CHAR);                         is_code_line = 1;                     }                     break;                 default:                     if (cur_state == DEFAULT) is_code_line = 1;                     else if (cur_state == BLOCKCOMMENT || cur_state == LINECOMMENT)                         is_comment_line = 1;                     break;                 }             } while (cur_char != '\n' && get_cur_char(fp, &cur_char));         }                  /*         * 当前行分析结束，累加数据。         */         ++total_lines;         comment_lines += is_comment_line;         blank_lines += is_blank_line;         code_lines += is_code_line;     }      printf("Total lines: %d\n", total_lines);     printf("Code lines: %d\n", code_lines);     printf("Comment lines: %d\n", comment_lines);     printf("Blank lines: %d\n", blank_lines);      fclose(fp);     return 0; }   测试文件：test.c /**  *  * 这是一份没有语法错误的c源程序，共有28行，代码11行，注释15行，空行6行  *  * （2023-4-21. Mr Yao） **/   #include <stdio.h>  int main(int, char**) { //这行有代码和注释     //\ 本行只有注释， /* " ' 下面2行只有代码。     char a[] = "\     // */ /* abcd";          /*本行只有注释\*/         //本行只有注释      char f[] = "// \""; //本行既有代码也有注释         /**本行有代码和注释。// *\*/char b = '\"';//本行有代码和注释\     \     /**上一行只有注释，本行也只有注释\      * 本行只有注释*/int a = 1;       /*本行既有注释也有代码*/char c[] = "\     \     \\\\\\\\""//上一行只有代码，本行也只有代码";     return 0; }

user: user-0
content: 非常感谢

user: user-2
content: #include <stdio.h>      int main() {       FILE *fp;       char filename[100];       int total_lines = 0, comment_lines = 0, blank_lines = 0;          printf("Enter the filename: ");       scanf("%s", filename);          fp = fopen(filename, "r");          if (fp == NULL) {           printf("Failed to open file.\n");           return 1;       }          while (fgets(filename, sizeof(filename), fp)) {           if (filename[0] == '#') {               comment_lines++;           } else if (filename[0] == '\n') {               blank_lines++;           } else {               total_lines++;           }       }          fclose(fp);          printf("Total lines: %d\n", total_lines);       printf("Comment lines: %d\n", comment_lines);       printf("Blank lines: %d\n", blank_lines);          return 0;   }

user: user-0
content: 谢谢啦