小白笔记-------------------课程作业(sfind)
2016-04-18 09:45
316 查看
1、功能实现不难,主要用到了getopt
2、在最初写代码的时候没考虑到要实现自由组合,结果导致最后只能实现两两组合
3、如果最初考虑到能自由组合,也许代码就不一样了
4、调的时候有一些小错误,每次都觉得这都能出错,已经没问题了啊,结果发现还是有问题的,而且是不起眼的小问题,或者就是明显的问题自己却想当然了
5、遇到这些时候,着急没用,自己慢慢细细找,总能找出来,这也就侧面说明了注释的重要性!(然而我还是很少注释。。要培养这个习惯!!!)
6、代码太长了,就给我自己看看,以后回头看看自己最初时写的代码
2、在最初写代码的时候没考虑到要实现自由组合,结果导致最后只能实现两两组合
3、如果最初考虑到能自由组合,也许代码就不一样了
4、调的时候有一些小错误,每次都觉得这都能出错,已经没问题了啊,结果发现还是有问题的,而且是不起眼的小问题,或者就是明显的问题自己却想当然了
5、遇到这些时候,着急没用,自己慢慢细细找,总能找出来,这也就侧面说明了注释的重要性!(然而我还是很少注释。。要培养这个习惯!!!)
6、代码太长了,就给我自己看看,以后回头看看自己最初时写的代码
/****************************************************** * Author : Aaron92 * Date : 2016-04-09 02:59 * Filename : sfind.c * Description : ******************************************************/ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<string.h> #include<getopt.h> #include<pwd.h> #include<grp.h> void getName(char dirname[]); void getSize(int size); void getType(char *type); void getUid(char uid[]); void getGid(char gid[]); char* uid_to_name(uid_t uid); char* gid_to_name(gid_t gid); typedef struct globalList{ char* name ; int size ; char* type ; char* gid ; char* uid ; }globalList; char exdata[500][500]; int right[5] = {0,0,0,0,0};//in order to remark the choice int num[5] = {0,99,199,299,399};// in order to remain the number int numArgc; void main(int argc,char** argv){ numArgc = argc; globalList g = {NULL,0,NULL,NULL,NULL}; int opt = 0; opt = getopt( argc, argv, "n:s:t:g:u:h?"); while( opt != -1 ) { switch( opt ) { case 'n': { g.name = optarg; right[0] = 1; getName(g.name); break; } case 's': { g.size = atoi(optarg); right[1] = 1; getSize(g.size); break; } case 't': { g.type = optarg; right[2] = 1; getType(g.type); break; } case 'g': { g.gid = optarg; right[4] = 1; getGid(g.gid); break; } case 'u': { g.uid = optarg; right[3] = 1; getUid(g.uid); break; } case 'h': printf("only -n,-s,-t,-g,-u is in use!\n"); break; case '?': printf("input -h for help!\n"); break; default: /* You won't actually get here. */ break; } opt = getopt( argc, argv, "n:s:t:g:u:h?"); } } void getName(char dirname[]){ DIR* dir_ptr; struct dirent* direntp; int i = 0,j ,k = 0,l = 0; if((dir_ptr = opendir(".")) == NULL){ fprintf(stderr,"sfind:cannot open current directory\n"); }else{ while((direntp = readdir(dir_ptr)) != NULL){ if(strcmp(direntp->d_name,dirname) == 0){ strcpy(exdata[i],direntp->d_name); i++; num[0]++; } } } if(numArgc < 4){ int s; for(s = 0;s <= num[0];s++){ printf("%s\n",exdata[s]); } }else{ while(k <= num[0]){ for(j = 1;j < 5; j++){ if(right[j] == 1){ while( l < 100){ if(strcmp(exdata[k],exdata[0+j*100+l]) == 0 ){ printf("%s\n",exdata[k]); } l++; } } } k++; } } } void getSize(int size){ DIR* dir_ptr; struct dirent* direntp; struct stat infobuf; int i = 100,j,k = 100,l = 0; if((dir_ptr = opendir(".")) == NULL){ fprintf(stderr,"sfind:cannot open current directory\n"); }else{ while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); } if((size*1000) >= infobuf.st_size){ strcpy(exdata[i],direntp->d_name); i++; num[1]++; } } } if(numArgc < 4){ int s ; for(s = 100;s <= num[1];s++){ printf("%s\n",exdata[s]); } }else{ while(100 <= k && k<= num[1]){ if(right[0] == 1){ while(l < 100){ if(strcmp(exdata[k],exdata[100-100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } for(j = 2;j < 5;j++){ if(right[j] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[100+(j-1)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; }} } void getType(char *type){ DIR* dir_ptr; struct dirent* direntp; struct stat infobuf; int i = 200,j,k = 200,l = 0; if((dir_ptr = opendir(".")) == NULL){ fprintf(stderr,"sfind:cannot open current directory\n"); }else{ switch(*type){ case 'd': while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); } if(S_ISDIR(infobuf.st_mode)){ strcpy(exdata[i],direntp->d_name); i++; num[2]++; } } if(numArgc < 4){ int s; for(s = 200;s <= num[2];s++){ printf("%s\n",exdata[s]); } }else{ while(200 <= k && k <= num[2]){ if(right[0] == 1){ while( l < 100){ if(strcmp(exdata[k],exdata[200-200+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } if(right[1] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200-100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } for(j = 3;j < 5;j++){ if(right[j] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200+(j-2)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; } } break; case 'c': while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); } if(S_ISCHR(infobuf.st_mode)){ strcpy(exdata[i],direntp->d_name); num[2]++; i++; } } if(numArgc < 4){ int s; for(s = 200;s <= num[2];s++){ printf("%s\n",exdata[s]); } }else{ while(200 <= k && k <= num[2]){ if(right[0] == 1){ while( l < 100){ if(strcmp(exdata[k],exdata[200-200+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } if(right[1] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200-100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } for(j = 3;j < 5;j++){ if(right[j] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200+(j-2)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; }} break; case 'b': while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); } if(S_ISBLK(infobuf.st_mode)){ strcpy(exdata[i],direntp->d_name); i++; num[2]++; } } if(numArgc < 4){ int s; for(s = 200;s <= num[2];s++){ printf("%s\n",exdata[s]); } }else{ while(200 <= k && k <= num[2]){ if(right[0] == 1){ while( l < 100){ if(strcmp(exdata[k],exdata[200-200+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } if(right[1] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200-100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } for(j = 3;j < 5;j++){ if(right[j] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200+(j-2)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; }} break; case 'l': while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); } if(S_ISLNK(infobuf.st_mode)){ strcpy(exdata[i],direntp->d_name); i++; num[2]++; } } if(numArgc < 4){ int s; for(s = 200;s <= num[2];s++){ printf("%s\n",exdata[s]); } }else{ while(200 <= k && k <= num[2]){ if(right[0] == 1){ while( l < 100){ if(strcmp(exdata[k],exdata[200-200+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } if(right[1] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200-100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } for(j = 3;j < 5;j++){ if(right[j] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200+(j-2)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; }} break; case '-': while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); } if(S_ISREG(infobuf.st_mode)){ strcpy(exdata[i],direntp->d_name); i++; num[2]++; } } if(numArgc < 4){ int s; for(s = 200;s <= num[2];s++){ printf("%s\n",exdata[s]); } }else{ while(200 <= k && k <= num[2]){ if(right[0] == 1){ while( l < 100){ if(strcmp(exdata[k],exdata[200-200+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } if(right[1] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200-100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } for(j = 3;j < 5;j++){ if(right[j] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[200+(j-2)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; }} break; default : break; } } } void getUid(char uid[]){ DIR* dir_ptr; struct dirent* direntp; struct stat infobuf; int i = 300,j,k = 300,l = 0; if((dir_ptr = opendir(".")) == NULL){ fprintf(stderr,"sfind:cannot open current directory\n"); }else{ while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); }else{ if(strcmp(uid,uid_to_name(infobuf.st_uid)) == 0){ strcpy(exdata[i],direntp->d_name); i++; num[3]++; } } } if(numArgc < 4){ int s; for(s = 300;s <=num[3];s++){ printf("%s\n",exdata[s]); } }else{ while( 300 <= k && k <= num[3]){ l = 0; for(j = 0;j < 3;j++){ if(right[j] == 1){ while(l < 100){ if(strcmp(exdata[k],exdata[300-(-j+3)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } if(right[4] == 1){ l = 0; while(l < 100){ if(strcmp(exdata[k],exdata[300+100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } k++; } } } } void getGid(char gid[]){ DIR* dir_ptr; struct dirent* direntp; struct stat infobuf; int i = 400,j,k = 400,l = 0; if((dir_ptr = opendir(".")) == NULL){ fprintf(stderr,"sfind:cannot open current directory\n"); }else{ while((direntp = readdir(dir_ptr)) != NULL){ if(stat(direntp->d_name,&infobuf) == -1){ printf("sfind:cannot open current directory\n"); }else{ if(strcmp(gid,gid_to_name(infobuf.st_gid)) == 0){ strcpy(exdata[i],direntp->d_name); i++; num[4]++; } } } if(numArgc < 4){ int s; for(s = 400;s <=num[4];s++){ printf("%s\n",exdata[s]); } }else{ while (400 <= k && k <= num[4]){ l = 0; for(j = 0; j < 4;j++){ if(right[j] == 1){ while(l < 100){ if(strcmp(exdata[k],exdata[400-(-j+4)*100+l]) == 0){ printf("%s\n",exdata[k]); } l++; } } } k++; } } } } char* uid_to_name(uid_t uid){ struct passwd *getpwuid(),*pw_ptr; static char numstr[10]; if((pw_ptr = getpwuid(uid))== NULL){ sprintf(numstr,"%d",uid); return numstr;} else return pw_ptr->pw_name; } char* gid_to_name(gid_t gid){ struct group *getgrgid(),*grp_ptr; static char numstr[10]; if((grp_ptr = getgrgid(gid)) == NULL){ sprintf(numstr,"%d",gid); return numstr;} else return grp_ptr->gr_name; }
相关文章推荐
- struct-config.xml配置文件的解析
- 堆heap和栈Stack(百科)
- I.MX6 Android netperf
- jdk环境变量的设置
- Java基础第一章
- 安卓开发之获取SD卡的读写权限
- Jquery解决“动画积累”问题
- 关于软件设计
- hdu1028Ignatius and the Princess III(母函数)
- eclipse中常用快捷键总结、提高开发效率
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个出现一次的数字
- 机器学习基石第一讲:the learning problem
- django--模板的加载和导入
- Linux中的常用符号解释
- C++中new的越界访问问题
- redis结构分析——RDB文件
- ArtEditor富文本编辑器增加表单提交功能
- 2016网易web前端开发实习生面试记录
- ASCII与BCD
- Vim