C语言中使用lex统计文本文件字符数_C 语言

我曾经在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);
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
lex
c语言统计字符个数、c语言统计字符串长度、c语言字符统计、c语言统计字符数、c语言字符串统计,以便于您获取更多的相关知识。

时间: 2024-08-03 16:19:49

C语言中使用lex统计文本文件字符数_C 语言的相关文章

简单总结C语言中各种类型的指针的概念_C 语言

C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念.  常量指针:首先它是一个指针,常量只是用来修饰指针的定语.其定义如下: char const * cp; char a='a'; 如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针.即指向常量的指针. cp=&a; //正常语法 *cp=a; //错误语法,因为其指向的值是一个常量  指针常量:首先它是一个常量

C语言中的各种文件读写方法小结_C 语言

前言    找工作的时候,曾经用C语言练习过一段时间的算法题目,也在几个还算出名的OJ平台有过还算靠谱的排名.之前以为C语言只限于练习一下算法,但是工作中的一个问题解决让我意识到C语言的用处还是非常广泛的.下面介绍一下,如果用C语言来操作文件保存一个字符串,和读取一个字符串.算法中往往都是printf来打印出结果,但是真实工作中往往通过文件来进行一些持久化的存储工作. C-File I/O    文件的I/O操作是每一门语言的重点,因此这里我先来介绍一下如何用C语言去进行文件的I/O操作. 文件

C语言中的函数指针基础学习教程_C 语言

顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型. B) 也很简单,与C)表达式相比,唯一不同的就是函数的

浅谈c语言中转义字符的用法及注意事项_C 语言

c语言中的转义字符: \a 响铃符 \b 退格 \f 换页符 \n 换行符 \r 回车符(回到该行的首位置) \v 纵向制表符 \\ 反斜杠 \? 问号(?经vs10测试可以直接打印) \"(\') 双引号(单引号) \ooo 八进制数(ooo表示一个用8进制数表示出来的对应ANSII代码对应出字符,用此方法可以表示出所有ASCII字符.不过测试发现打不出%号,存疑!) \xhh 十六进制数(功能同八进制数,用hh表示一个十六进制数,如\x20表示空格)  注:使用转义字符的退格符,换行符,回车

C语言中逻辑运算符与条件运算符的学习教程_C 语言

逻辑运算符 逻辑运算符,用于对包含关系运算符的表达式进行组合,形成新的表达式:结果也是只有真或假两种情况,结果值用 BOOL 类型变量存储. 运算符 解释 结合方式 () [] -> . 括号(函数等),数组,两种结构成员访问 由左向右 ! ~ ++ -- + -  * & (类型) sizeof 否定,按位否定,增量,减量,正负号, 间接,取地址,类型转换,求大小 由右向左 * / % 乘,除,取模 由左向右 + - 加,减 由左向右 << >> 左移,右移 由左向

详解C语言中的#define宏定义命令用法_C 语言

#define命令#define定义了一个标识符及一个串.在源程序中每次遇到该标识符时,均以定义的串代换它.ANSI标准将标识符定义为宏名,将替换过程称为宏替换.命令的一般形式为: #define identifier string 注意: 1.该语句没有分号.在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束. 2.宏名定义后,即可成为其它宏名定义中的一部分. 3.宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换.例如: #define XYZ th

c语言中 基于随机函数的使用详解_C 语言

在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a). 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,

C语言中函数与指针的应用总结_C 语言

1. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型. 复制代码 代码如下: #include<stdio.h> void fun(){} int main(void){   printf("%p %p %p\n", &fun, fun, *fun);   return 0;} -------------------------------------------------------------

c语言中字符串分割函数及实现方法_C 语言

1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a