本文主要是介绍c语言,代码统计器、盗墓者是个丑奴儿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
//盗墓者是个丑奴儿,原
//博主个人网站 :https://daomu.kaige123.com
//打完一波小广告,进入正题
//头文件引入
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <dirent.h>
//函数声明
int opend(const char * pathname);
int judge(char * pathname);
char * str(const char * str1,const char * str2);
void readf(const char * pathname);
DIR * dir=NULL;
//参数:pathname,作用:opendir打开pathname。判断:如果是文件,调用judge()统计代码。如果是目录,调用readf()递归目录
int opend(const char * pathname){
dir=opendir(pathname);
if(dir==NULL)
return -1;
struct dirent * reado=NULL;
while((reado=readdir(dir))!=NULL){
char * tmps=NULL;
if(reado->d_name[0]=='.')
continue;
tmps=str(pathname,reado->d_name);
if(reado->d_type==DT_DIR){
readf(tmps);
}else{
judge(tmps);
}
if(reado==NULL)
free(tmps);
}
}
//参数:pathname,作用,递归目录,如果发现递归到文件了,调用judge()统计代码。如果是目录,自调
void readf(const char * pathname){
DIR * dir=opendir(pathname);
struct dirent * reado=NULL;
while((reado=readdir(dir))!=NULL){
char * tmps=NULL;
if(reado->d_name[0]=='.')
continue;
tmps=str(pathname,reado->d_name);
if(reado->d_type==DT_DIR){
readf(tmps);
}else{
judge(tmps);
}
if(reado==NULL)
free(tmps);
}
}
//count_num统计字数
//rows统计行数
//统计的.c文件个数
int count_num=0;
int rows=0;
int gs=0;
//参数:pathname(文件路径),作用,过滤出.c文件,统计.c文件的字数,行数
//第一步,先等于"\0",去掉\。第二步,strstr过滤出.c文件。第三步,打开处理后的pathname。第四步,获得文件大小,read读取内容。第五步:过滤掉内容于10与32的,10空格,32换行。
//过滤10与32的剩余长度,就是统计出:文件有效长度。过滤掉32,就是统计出:文件的有效行数
int judge(char * pathname){
pathname[strlen(pathname)-1]='\0';
if(strstr(pathname,".c")==NULL)
return 0;
int fd=open(pathname,O_RDWR);
int length=lseek(fd,0,SEEK_END);
close(fd);
fd=open(pathname,O_RDWR);
char ar[length];
memset(ar,'0',length);
ar[sizeof(ar)]='\0';
read(fd,ar,length);
for(int i=0;i<length;i++){
if(ar[i]!=10 && ar[i]!=32)
count_num++;
if(ar[i]==10)
rows++;
}
close(fd);
}
//参数:str1,str2。将str1yustr2拼接,加/。如/usr与a.out,返回/usr/a.out/
char * str(const char * str1,const char * str2){
int size1=strlen(str1);
int size2=strlen(str2);
char * arr=(char *)malloc(size1+size2+2);
memset(arr,'0',size1+size2);
memcpy(arr,str1,size1);
memcpy(&(arr[size1]),str2,strlen(str2));
arr[size1+size2]='/';
return arr;
}
//main接收传参,进行程序运行
int main(int arg,char ** arv){
if(arv[1]!=NULL)
opend(arv[1]);
printf("number=%d rows=%d gs=%d\n",count_num,rows,gs);
return 0;
}
运行结果:字数6w,行数5k,统计个数200,半年前做了个Java版代码统计器,统计还存在的电脑Java代码,残存3w行
这篇关于c语言,代码统计器、盗墓者是个丑奴儿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!