彻底理解指针第二篇

来源:互联网 发布:恒扬数据市值 编辑:程序博客网 时间:2024/05/20 05:45

    上午学习了指针的命令行参数,感受不愧是大师的作品啊!写的真赞。。

    先来讲讲指针数组: 指针数组主要用在存放长度不同的字符串,数组的每一行可以存储不同的长度。这个在哈希表中利用很广泛。 关于指针数组的初始化,请看下面这个简单的例子:

#include <stdio.h>#define MAX 10//return month namechar *name(int n){char *name[]={"Illegal month","january","february","march","april","may","june","july","august","september","october","november","december"};return (n<1 || n>12)?name[0]:name[n];}int main(){int n;char *p;while(scanf("%d",&n)!=EOF){p=name(n);printf("%s\n",p);}return 0;}

   下面来讲命令行参数:

   argc:代表参数计数,第一个是程序名字 

   argv是一个指向指针数组的指针。也就是说argv是一个指针。

   argv[argc]的值一定是一个空指针。

   先来看最简单的echo程序回显字符),体会argc和argv的用法。

#include <stdio.h>int main(int argc,char *argv[]){//数组方式实现//int i;//for(i=1;--argc>0;i++)//printf((argc>1)?"%s ":"%s",argv[i]);//指针方式实现while(--argc)printf((argc>1)?"%s ":"%s",*++argv);printf("\n");return 0;}

   接下来,要分析一个模式查找函数。

  
#include <stdio.h>#include <string.h>#define MAXLEN 1000//读取一行int getLine(char *s,int maxline){char c;int i;for(i=0;(i<maxline-1) && ((c=getchar())!=EOF) && c!='\n';i++)s[i]=c;if(c=='\n'){s[i]='\n';i++;}s[i]='\0';return i;}int main(int argc,char *argv[]){char line[MAXLEN];int find=0;if(argc!=2){printf("error\n");return;}while(getLine(line,MAXLEN)>0)if(strstr(line,argv[1])!=NULL){printf("%s\n",line);find++;printf("%d\n",find);return 0;}

   最后请仔细分析这个改进版的,特别像grep命令的查找函数。从中你可以体会到argc

   和argv最好的解释

   find -x -n 模式

   -x:表示打印不匹配的行

   -n:表示打印行号

   注意下面几个方面:

   1.在循环结束的时候,argc的值=1表示还没有处理的参数数目,即最后的模式串。

   2.argv最后指向未处理的模式串。

   3.(*++argv)[0]等同于(*(*++argv)):指向字符串第一个字符。argv必须先++,因为  第一个参数是程序名字。

   4.(*++argv[0]等同于(*++(*argv)):指向字符串第二个字符,判断参数是x还是n

理解以上这几个,程序就很简单了。永远牢记就是:argv是指向指针数组的指针。

  
#include <stdio.h>#include <string.h>#define MAXLINE 1000//读取一行int getLine(char *s,int maxline){char c;int i;for(i=0;(i<maxline-1) && ((c=getchar())!=EOF) && c!='\n';i++)s[i]=c;if(c=='\n'){s[i]='\n';i++;}s[i]='\0';return i;}int main(int argc,char *argv[]){char line[MAXLINE];//设置标志位int except=0,number=0;int found=0;char c;int lineno=1;//首先读取参数while(--argc>0 && (*(*++argv))=='-')//也可以这样if(c=(*++argv[0]))//原书这里用的是循环,但我觉得没有必要,这样更容易理解if(c=(*++(*argv))){if(c=='x')except=1;else if(c=='n')number=1;elseargc=0;}if(argc!=1)printf("please grep -x -n");else{while(getLine(line,MAXLINE)>0){if(except==1){if(strstr(line,*argv)==NULL){if(number==1){printf("%d:",lineno);printf("%s",line);found++;lineno++;}else{printf("%s",line);found++;lineno++;}}}else{if(strstr(line,*argv)!=NULL){if(number==1){printf("%d:",lineno);printf("%s",line);found++;lineno++;}else{printf("%s",line);found++;lineno++;}}}}}//上述我写的有点复杂,原书是这样写的,很巧妙/*if(strstr(line,*argv)!=NULL)!=except){if(number)printf("%d",lineno;printf("%s",line);found++;}*/printf("%d\n",found);return 0;} 
原创粉丝点击