文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>实现cp命令--优化对选项的判断

实现cp命令--优化对选项的判断

时间:2010-07-29  来源:edsionte

现在我们已经实现了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]);
        }

好了,改完上面的代码,下面就和以前的一样了。这样就可以避免开始的时候我们所举的例子。

排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载