C基本操作:*argv=argv[0] while (--argc > 0 && (*++argv)[0] == '-')/n while (c = *++argv[0])/n switch (c)

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]是处理该命令行参数字符串中的不同字符。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值