a.ubuntu的argv[]是带有路径信息的,所以不能用答案中的strcmp。
b.*argv == argv[0]都是第一个命令行参数字符串。++argv指向下一个命令行参数。
c.(++argv)[0]指向下一个命令行参数的第1个字符。++(argv[0])指向第一个命令行参数的第2个字符
有关C语言命令行参数,原代码为设置tab的开始位置和结束位置,下面是在gdb调试工具中的拷贝。
(gdb) r -4 +5
Starting program: /home/kenchang/文档/201811/c_drill/5-12/entab -4 +5
Breakpoint 1, esettab (argc=3, argv=0x7fffffffdf88, tab=0x7fffffffde30 “”) at entab.c:68
68 if(argc <= 1)
(gdb) p argc
$9 = 3
(gdb) p argv
$10 = (char **) 0x7fffffffdf88 说明argv是个指向字符串数组的指针。
(gdb) p argv[0]
$11 = 0x7fffffffe2e6 “/home/kenchang/文档/201811/c_drill/5-12/entab”
(gdb) p argv[1]
$12 = 0x7fffffffe316 “-4”
(gdb) p argv[2]
$13 = 0x7fffffffe319 “+5”
(gdb) p *argv[1]
$14 = 45 ‘-’
(gdb) p *(argv[1]+1)
$16 = 52 ‘4’
(gdb) p argv[1]+1
$17 = 0x7fffffffe317 “4”
*argv=argv[1],这两个都是char 变量,但(argv+1)指向了下个命令行参数,argv[1]+1则指向当前命令行参数的下一个字符。
代码:
为了方便快捷,带有命令行参数的命令通常要求和参数位置无关,参数可以连写,比如:sort -n -r,sort -r -n,sort -nr,sort -rn这种方式输入的命令行都是sort可以接受的,这也是linux的默认标准。
static char option = 0;
int main (int argc,char *argv[]) {
int nlines;
int c;
while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
case 'n':
option |= NUMERIC;
break;
case 'r':
option |= DECR;
break;
default:
printf("sort:illegal option %c\n",c);
break;
}
}
上面就是命令行处理套路,必须在函数正式处理前,先处理全部命令行参数,这里用了一个8bit的option,理论上可以保存8个命令行参数状态。内部对应num比较法和逆序参数均设为1,使用通过位运算存储和恢复输入值,如果再有一个命令行参数,真值就可以设为4了。
两个while循环确保参数无论是sort -n -r,sort -r -n,sort -nr,sort -rn均可处理。(++argv)[0]指针的增加是处理不同命令行参数,++argv[0]是处理该命令行参数字符串中的不同字符。