国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言中使用lex統計文本文件字符數

2020-01-26 15:07:53
字體:
來源:轉載
供稿:網友

我曾經在Linux上寫的一個C程序,借助Lex做詞法分析來同時統計N個文本文件的字符數,單詞數和行數。讓我覺得Lex確實挺有意思的。確實Lex的功能非常強大,用來做小巧的詞法分析非常適合,也非常好用。這個程序參考了《Lex與Yacc》上的一個例子。

%{ unsigned int char_count = 0, word_count = 0, line_count = 0; %} %% [^ /t/n]+ {word_count++; char_count+=yyleng;}; /n {char_count++; line_count++;}; . char_count++; %% char **file_list; unsigned int current_file = 0; unsigned int total_file = 0; unsigned int total_cc = 0; unsigned int total_wc = 0; unsigned int total_lc = 0; typedef struct file_info{   unsigned int c;   unsigned int w;   unsigned int l;   char *name; }INFO; INFO **all; int create_info(int num) {   INFO *tmp;   int i;   if (num <= 0){     return -1;   }   all = (INFO **)malloc(sizeof(int *)*num);   for (i = 0; i < num; i++){     tmp = (INFO *)malloc(sizeof(INFO));     tmp->c = 0;     tmp->w = 0;     tmp->l = 0;     tmp->name = NULL;     all[i] = tmp;   }   return 1; }   int delete_info(int num) {   int i;   if ((all == (INFO **)0) || num <= 0){     return -1;   }   for (i = 0; i < num; i++){     free(all[i]);   }   free(all);   return 1; } int set_info(int pos) {   int length = 0;   if (pos < 0){     return -1;   }   all[pos]->c = char_count;   all[pos]->w = word_count;   all[pos]->l = line_count;     all[pos]->name = file_list[pos];      return 1; } int main(int argc, char** argv) {   FILE *file;     int position = 0;   int i;      file_list = argv + 1;   total_file = argc - 1;   current_file = 0;      printf("--------------------------------------------------------------/n",  total_file);      if (argc > 1){     if (create_info(total_file) == -1){       fprintf(stderr, "%s/n", "Encounter a error when malloc memory.");       exit(1);     }   }   if (argc == 2){                 file=fopen(argv[1], "r");     if (!file){       fprintf(stderr, "Could not open %s./n", argv[1]);       delete_info(total_file);       exit(1);     }         yyin = file;   }      yywrap();   yylex();     if (argc > 1){     total_cc += char_count;     total_wc += word_count;     total_lc += line_count;              if (set_info(current_file-1) == -1){       fprintf(stderr, "%s/n", "Encounter a error when set information to  INFO.");       delete_info(total_file);       exit(1);     }              for (i = 0; i < total_file; i++){       printf("char:%-8lu word:%-8lu line:%-8lu file name:%s/n", all[i]-> c, all[i]->w, all[i]->l, file_list[i]);     }     printf("----------------------- total -------------------------------- /n");     printf("chars:%-8lu words:%-8lu lines:%-8lu files:%d/n", total_cc, tot al_wc, total_lc, total_file);   }else{         printf("char:%-8lu word:%-8lu line:%-8lu/n", char_count, word_count, l ine_count);   }      delete_info(total_file);   return 0; }  yywrap() {   FILE *file = NULL;      if ((current_file > 0) && (current_file < total_file) && (total_file > 1)) {     total_cc += char_count;     total_wc += word_count;     total_lc += line_count;          if (set_info(current_file-1) == -1){       fprintf(stderr, "%s/n", "Encounter a error when set information to  INFO.");       delete_info(total_file);       exit(1);     }            char_count = word_count = line_count = 0;     fclose(yyin);       }   while ((file_list[current_file] != (char *)0) && (current_file < total_fil e)){          file = fopen(file_list[current_file++], "r");     if (!file){       fprintf(stderr, "could not open %s .", file_list[current_file - 1] );     }else{       yyin = file;       break;     }   }   return (file? 0 : 1); } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 大连市| 凤凰县| 将乐县| 蛟河市| 娱乐| 调兵山市| 察哈| 双鸭山市| 巍山| 得荣县| 怀远县| 静安区| 仪征市| 安龙县| 绥阳县| 宜春市| 永清县| 靖远县| 新晃| 莱州市| 玛沁县| 新干县| 合川市| 通化市| 辽宁省| 雅江县| 青河县| 临城县| 卓资县| 陈巴尔虎旗| 根河市| 石阡县| 如东县| 柳河县| 大邑县| 永昌县| 临洮县| 双辽市| 新源县| 前郭尔| 城固县|