现在我们已经实现了my_cp。那么我们来运行一下下面的命令吧:
gues@huangwei-desktop:~/code/shell_command$ ./my_cp -r dir/ newdir/ -r my_cp: can't get file status of "-r" : no this file or directory.
问题出来了,我们并没有考虑到多个重复选项的情况,因此上面命令把末尾的-r当成了文件名。如果用cp执行上面的指令,那么是成功的,因为多个重复选项在cp命令下就相当于一个。因此我们下面来修改代码。
你可以让检查选项处的param_r=1;改为param+=1;然后再加入下面的代码,当出现这种情况的时候,让其出错。
if(param_r>1) { printf("my_cp:invalid options.\n"); exit(1); }
为了完美一些,我们可以这样做。首先我们将原来index_r改成数组index,记录出现-r的位置。我们可以让这个数组全部初始化为0,如果参数中,第i个参数为-r或者-R,那么就将index[i]赋值为i。并且这时候的param_r就要累计出现合法(对于本程序,合法选项就是-r或-R了)选项的个数。
//check the legality of the options,only -r or -R for(i=1;i<\argc;i++) { if(argv[i][0]=='-') { if((!strcmp(argv[i],"-r")||!strcmp(argv[i],"-R"))) { param_r+=1; index[i]=i; } else { printf("my_cp:invalid options: %s\n",argv[i]); exit(1); } } }
那么在计算源文件数目的时候也相应的就有了小改动。
if(param_r) { num=argc-1-param_r; src_num=num-1; } else { num=argc-1; src_num=num-1; } if(num<\2) { printf("my_cp: [option] \n"); exit(1); }
提取目标文件的时候,就有些小麻烦,但是也是可以解决的。我们从命令行参数末尾开始,找到那个不是选项的那个参数,因为目标文件总是靠近末尾的。比如:./my_cp dir/ newdir/ -r -r
//extract the dest path for(i=argc-1;i>\0;i--) { if(!strcmp(argv[i],"-r")||!strcmp(argv[i],"-R")) continue; else break; } if(i==argc-1) { strcpy(dest_path,argv[i]); } else { strcpy(dest_path,argv[i]); }
好了,改完上面的代码,下面就和以前的一样了。这样就可以避免开始的时候我们所举的例子的错误。