【问题标题】:Can I check command line arguments one by one in a loop?我可以在循环中一一检查命令行参数吗?
【发布时间】:2022-01-13 17:59:03
【问题描述】:

我试图让我的程序在循环中一个一个地检查输入的命令行参数,以便它从一个操作移动到下一个操作。

int main(int argc,char* argv[])
{
    int i = 1;
    if(argc == 1)
    {
        printf("One argument expected.\n");
        exit(EXIT_FAILURE);
    }
    createLog("log.txt");
    if (strcmp(argv[i++], "create") == 0)
    {
        createFile();
    }
    else if (strcmp(argv[i++], "copy") == 0)
    {
        copyFile();
    }
    else if (strcmp(argv[i++], "delete") == 0)
    {
        deleteFile();
    }
    else if (strcmp(argv[i++], "show") == 0)
    {
        readFile();
    }
    else if (strcmp(argv[i++], "append") == 0)
    {
        appendLine();
    }
    else if (strcmp(argv[i++], "deleteLine") == 0)
    {
        deleteInsert(True); //The argument isDelete to check if we wanted to delete or insert
    }
    else if (strcmp(argv[i++], "insertLine") == 0)
    {
        deleteInsert(False); //The argument isDelete to check if we wanted to delete or insert
    }
    else if (strcmp(argv[i++], "showLine") == 0)
    {
        showLine();
    }
    else if (strcmp(argv[i++], "exit") == 0)
    {
        printf("Closing program");
        exit(EXIT_SUCCESS);
    }
    else
    {
        printf("Please enter a valid argument");
    }
}

我将其视为一个循环,i 每次检查时都会不断增加。我尝试在 if else 语句之前使用 infinte do while 循环,但它最终给了我一个分段错误。

我的程序还应该创建、读取、追加行、显示行、插入和删除行。有可能做我想做的事吗?还是我应该改变我的方法?

【问题讨论】:

  • 你没有循环。您正在增加每个测试中的索引。因此,您要检查第一个参数是否为create,然后检查第二个参数是否为copy,然后检查第三个参数是否为delete,依此类推。
  • 是的,您可以使用循环。这样做很正常。但不要像你一样不断增加i
  • 在将选项与所有可能的命令进行比较后,您只能增加 i
  • i keeps on increasing every time it checks it,你知道它只检查一次吗?如果第一个 if 为真,则不会评估任何 else if
  • @Jabberwocky 问题是“我可以在循环中一一检查命令行参数吗?”。如果应用程序在单个命令行中有多个参数“创建副本删除”是有意义的,那就另当别论了。

标签: c command-line-arguments


【解决方案1】:

您可能希望制作一些更快且更易于维护的东西,例如(将其视为伪代码,因为我尚未编译或测试):

typedef struct
{
  const char* command;
  void (*action)(void)
} arg_command_t;

const arg_command_t commands[] =  //sorted in alphabetic order!
{
  { "copy",   copyFile   },
  { "create", createFile },
  ...
};

...

for(size_t i=1; i<argc; i++)
{
  const arg_command_t key = { argv[i], NULL };
  const arg_command_t* result;
  result = bsearch(&key, 
                   commands, 
                   sizeof commands / sizeof *commands,
                   sizeof *commands,
                   comp_func); 
  if(result != NULL)
  {
    result->action();
  }
}

然后像 strcmp 的包装器一样实现 comp_func,检查每个结构项的字符串成员。

【讨论】:

  • 恐怕这有点超出了 OP 的范围,即使这是正确的方法。
  • @Jabberwocky 我不这么认为,只需研究bsearch 的工作原理就可以了。
  • 忘记我的 cmets,我被 txt "One argument expected.\n" 弄糊涂了。我会删除它们。一会儿我也删掉这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多