UNIX或LINUX下很多的命令都是由C语言编写,本程序类似于grep命令.
本例子摘自K&R的C程序设计语言
#include
#include
#define MAXLINE 1000
int getline(char *line,int max);
/*打印所有与第一个参数指定的模式相匹配的行
-x 表示打印与模式不匹配的所有行
-n 表示打印行号
如:find -x -n 模式*/
/*
遇到-号跳过,检查下一个字符是什么参数
检查是否为子串
输出*/
int main(int argc,char *argv[])
{
char line[MAXLINE];
long lineno=0;//行号
char c;
int except,number,found;
except=number=found=0;
while(--argc>0 && (*++argv)[0]=='-')//检查第一个(argc=2)字符串的首个字符是否为'-'号
{// 注意:::(*++argv)[0]
// *++argv[0]==*(++argv[0]) 的区别
while( c=*++argv[0] )//检查'-'后的下一个字符
{
switch(c){
case 'x':
except=1;//如有参数,设置相应参数的状态作上标志
break;
case 'n':
number=1;
break;
default:
printf("illegal optiion %cn",c);
argc=0;
found=-1;
break;
}
}
}
if(argc!=1) //剩下一个模式字符串,所以argc的个数就为1
printf("Usage:find -x -n patternn");
else
while(getline(line,MAXLINE)>0)
{
lineno++;
if( ( (strstr(line,*argv) !=NULL))!=except)//如果不匹配,则打印出来
{
if(number)
printf("%ld:",lineno);
printf("%s",line);
found++;
}
}
return found;
}
int getline(char *line,int max)
{
int i=0;
char ch;
while( (ch=getchar())!=EOF && i
{
*(line+i)=ch;
i++;
}
if(ch=='n')
*(line+i++)='n';
*(line+i)='';
return i;
}