指针数组的应用与命令行参数
以下的程序,有助于展示指针数组的操作与命令行参数的应用。
下面的函数,可选参数的查找,当-x时,表示打印与模式不匹配的行,当-n时候表示打印行号。并且可选参数能够组合。
打印所有与第一个参数指定的模式相匹配的行。
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1000
int getline(char *s,int maxline);
int main(int argc,char *argv[])
{
char line[MAXSIZE];
long lineno=0;
int c,except=0,number=0,found=0;
while(--argc>0&&(*++argv)[0]=='-')
{
while(c=*++argv[0])
{
switch(c)
{
case 'x':
except=1;
break;
case 'n':
number=1;
break;
default:
printf("find: illegal option %c\n",c);
argc=0;
found=-1;
break;
}
}
if(argc!=1)
{
printf("Usage: find -x -n pattern\n");
}
else
{
while(getline(line,MAXSIZE)>0)
{
lineno++;
if((strstr(line,*argv)!=NULL)!=except)
{
if(number)
{
printf("%ld:",lineno);
}
printf("%s",line);
found++;
}
}
}
return found;
}
}
(1)对各个参数进行解释,lineno,用于标记行号,用于行号的输出,except用于标记输出匹配串或者不匹配串-x,number用于标记是否输出行号。found用于统计输出了多少行,暂时用不上。
c是一个中间变量方便编程判定(这种思想经常用上)。
(2)–argc之后得到的argc的值表示未处理的命令行参数个数(不包括首个参数),(++argv)[0]用于寻找未处理行的首字符,++argv[0]用于寻找未处理行的第二个字符以及接下来的字符。
(3)while循环中的想法是这样的,当还有未处理的命令行参数并且参数首字符为‘-’的时候,
判定该命令行参数,接下来的所有字符(用一个while循环),如果为x,则表明输出不匹配项目,except标记为1,如果为n,表明输出行号,number标记为1;出错的命令行直接跳出循环,用argc=0,以及found=-1,标志输出命令出错。
(4)于是根据具体的情况,如果剩余处理的参数不等于1,也即不执行模式处理功能,于是输出提示。
(5)当输入正确的模式匹配命令时,得到行以及行号后,判定是否与模式匹配,(匹配,不匹配)。同时要判定是否输出,(匹配的输出,不匹配的输出)。所以此处if需要两个等式的判定,先判定是否模式匹配,然后在此基础上判定模式匹配的输出还是模式不匹配的输出,此处用了两个!=进行判定,值得学习。
(6)判定指针数组是指向哪个字符,先画出指针数组示意图,关键看哪个指针++;(++argv)[0]是argv这个一级指针++;所以表示的是第二行第一个字符,++argv[0],是argv[0]这个二级指针++;所指向的是第一行第二个字符。