现在我们已经实现了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]);
}
好了,改完上面的代码,下面就和以前的一样了。这样就可以避免开始的时候我们所举的例子的错误。