您的位置:首页 > 其它

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

2016-04-18 09:45 316 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: