小白笔记-------------------课程作业(sfind)

1、功能实现不难,主要用到了getopt

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值