#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getline(char *line,int max);
int main(int argc,int *argv[]){
int c;
int lineno=0;
int number=0;
int except=0;
while(--argc&&(*++argv)[0]=='-'){
switch (c=*++argv[0]){
case n:
number=1;
break;
case x;
except=1;
break;
default:
printf("find:illegal option %c\n");
argc=0;
found=-1;
break;
}
}
if(argc!=1){
printf("Usage:find -x -n pattern\n");
}else{
while(getline(line,MAXLINE)>0){
lineno++;
if(strstr((line,*argv)!=NULL)!=except){
if(number){
printf("%d",lineno);
}
printf("%s",line);
found++;
}
}
}
return found;
}
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000 //宏定义 AMXLINE值为1000
int getline(char *s,int lim) //自定义函数getline,形参为char *s,int lim
{
int i,c;
for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i) //读取字符,判断是否超长或结束
*s++=c; // 这句的意思相当于*s=c ; s++;
if(c=='\n') // 判断c是否是换行符
{
*s=c; //写入换行符
++i; // i自增
}
*s='\0'; //写入结束符
return i; //返回i,也就是读入字符的个数。
}
main(int argc,char *argv[]) //主函数,带有形参是指在系统或其他程序调用该程序时的调用值
{
char line[MAXLINE]; //定义字符数组,相当于line[1000]
long lineno=0; //定义长整型变量
int c,except=0,number=0,found=0;
while(--argc>0&&(*++argv)[0]=='-') //当argc-1>0及++argv[0]=="-"时执行,argv[]是指针数组。用二维数组来表示的话++argv[0]相当于argv[1][0],且每次执行都增加。
while(c=*++argv[0]) //把argv[2][0]的值赋给c。同上
switch (c) //switch语句,根据c值选择性执行语句。
{
case 'x': //当c==x时
except=1;
break;
case 'n': //当c==n时
number=1;
break;
default: //当上面无对应值时
printf("find:illegal option %c\n",c);
argc=0;
found=-1;
break;
}
if(argc!=1) //如果argc不等于1 则执行下面语句
printf("Usage:find -x -n pattern\n"); //输出
else //如果argc等于1 就执行下面语句
while(getline(line,MAXLINE)>0) //如果执行getline函数返回值>0
{
lineno++; // lineno=lineno+1
if((strstr(line,*argv)!=NULL)!=except) //*argv是否存在于line中,且不等于except
{
if(number)
printf("%ld:",lineno);
printf("%s",line);
found++;
}
}
return found; //返回found值,返回给系统或调用者
}
if (argc != 1)printf("Usage: find -x -n pattern\n"); 这句是说如果这时候剩下的参数不是1个的话,就打印一个关于用法的提示
if ((strstr(line, *argv) != NULL) != except) 这句, 当 except ==1的时候这句相当于 if ( strstr(line, *argv) == NULL)
当except ==0 的时候这句相当于 if (strstr(line, *argv) != NULL) 而前面代码里如果找到x参数就设置 except=1 就是这么联系起来的