读书人

The C Programming Language有关问题

发布时间: 2012-02-24 16:30:38 作者: rapoo

The C Programming Language问题
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000

int getline(char *line, int max);

/* find: print lines that match pattern from 1st arg */
main(int argc, char *argv[])
{
char line[MAXLINE];
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, MAXLINE) > 0) {
lineno++;


if ((strstr(line, *argv) != NULL) != except) {
if (number)
printf( "%ld: ", lineno);
printf( "%s ", line);
found++;
}
}
return found;
}
中(*++argv)[0]和*++argv[0]各代表什么啊,不是很明白谢谢。


[解决办法]
(*++argv)[0]表示下一个参数的第一个字符即 "- "
*++argv[0]表示这个参数的第二个字符,即x或n
[解决办法]
如果是这样运行的./a.out param
则(*++argv)[0] == p, *++argv[0] == a
[解决办法]
楼上两位正解,分析一下:
如果是这样运行的:
a.out -a
则*argv == "a.out\0 " (或者是argv[0] = "a.out\0 " )
*++argv == "-a\0 " (或者是argv[1] = "-a\0 " )
(*++argv)[0],先执行++,argv是char **,也可以看成是指向一个字符串数组,它自加之后指向第2个字符串,即 "-a\0 ", 再执行[0],就是取这个字符数组的第个字符: '- '

执行完这条指令之后,argv已经指向了 "-a\0 ",再执行*++argv[0],先执行argv[0],[]的优先级比++高,就是取字符串数组的第1个字符串,就是 "-a\0 ",这时argv[0]指向的是该字符串的开头: '- ',自加之后指向下一个字符: 'a ',取它的内容就是 'a '

分析的时候注意一下指针的类型,象argv 是char**,指向的是字符串数组,(如果可以这样表达的话),而*argv,argv[0]这些都是char*型的。

读书人网 >C语言

热点推荐