C 为Unix程序构建arglist

C 为Unix程序构建arglist,c,unix,command-line-arguments,C,Unix,Command Line Arguments,为了根据用户输入多次执行程序,我需要改变发送到执行函数的arglist数组。在大多数情况下,我都可以使用它,除了设置最终标志以表示从信息增益、第一指数和基尼系数中使用哪个分割函数 该程序有三个不同的分割函数,用于根据训练和测试数据集创建决策树。我将arglist设置为模拟传统的CLI输入,因此这些是有效的输入: /决定表决5 /决策-列车投票-列车-1-测试投票-测试-1-退出投票.out-[i,s,g] 第一个命令所做的是对所有投票文件(从1到5)执行所有三个拆分函数,而第二个命令使用单个数据

为了根据用户输入多次执行程序,我需要改变发送到执行函数的arglist数组。在大多数情况下,我都可以使用它,除了设置最终标志以表示从信息增益、第一指数和基尼系数中使用哪个分割函数

该程序有三个不同的分割函数,用于根据训练和测试数据集创建决策树。我将arglist设置为模拟传统的CLI输入,因此这些是有效的输入:

/决定表决5

/决策-列车投票-列车-1-测试投票-测试-1-退出投票.out-[i,s,g]

第一个命令所做的是对所有投票文件(从1到5)执行所有三个拆分函数,而第二个命令使用单个数据集执行

我有一个temp arg数组,它是根据迭代构建的,当需要添加最终标志时,我就是这么做的:

//flag pointers
char *igFlag= "-i";
char *faFlag= "-s";
char *giFlag= "-g";

//copy temp array to specific arglist
igInput= cli;
faInput= cli;
giInput= cli;

//set information gain flag and null
igInput[7]= igFlag;
igInput[8]= '\0';

//set first attribute flag and null
faInput[7]= faFlag;
faInput[8]= '\0';

//set gini coefficient and null
giInput[7]= giFlag;
giInput[8]= '\0';   
这里的问题是,当faInput[7]=faFlag执行时,它将igInput[7]更改为匹配,然后当giInput[7]=giFlag执行时,所有三个数组都有匹配的[7]指针

在对整数数组使用相同的临时指针时,我遇到了类似的问题,但通过使用不同名称的变量,该问题得到了解决。这个问题正在发生,尽管我有不同的变量,它们之间没有任何关系

解决

为了回应AusCBloke的请求,我想知道我是如何解决这个问题的

首先,我决定不需要多个输入字符串,只需要修改最后一个插槽的字符串。所以我去掉了两个输入字符串,只使用了一个

最后我需要更多的标志,而不是重复代码,我创建了一个包含要使用的标志的char标志[5]。然后从for循环内部调用这些函数,其中使用的标志是当前索引值


总而言之,这种方法最终删除了大约30行不需要的代码。

您的代码不会将cli数组复制到各种输入变量。它将所有三个输入指针设置为指向cli阵列。由于igInput、faInput和giInput都指向同一个位置,因此更改faInput[7]似乎也会修改giInput[7],因为它们都指向相同的基础数据。您需要使用来复制周围的阵列数据。但是,正如@meagar所建议的,您应该真正使用它来处理args

//copy temp array to specific arglist
igInput= cli;
faInput= cli;
giInput= cli;

您的代码不会将cli数组复制到各种输入变量。它将所有三个输入指针设置为指向cli阵列。由于igInput、faInput和giInput都指向同一个位置,因此更改faInput[7]似乎也会修改giInput[7],因为它们都指向相同的基础数据。您需要使用来复制周围的阵列数据。但是,正如@meagar所建议的,您应该真正使用它来处理args

//copy temp array to specific arglist
igInput= cli;
faInput= cli;
giInput= cli;
这里的问题是当faInput[7]=faFlag执行时,它会改变 I输入[7]以匹配,然后当执行giInput[7]=giFlag时, 这三个数组都有匹配的[7]指针

您没有复制cli,而是将每个字符*都设置为指向cli。因此,igInput[7]==faInput[7]==giInput[7]==cli[7]

如果不使用meagar的getopt建议,请为ig/fa/gaInput和memcpy cli分配内存

编辑:哦,等等,你是想把这些参数传给别的东西,而不是读入它们?cli像某种argv吗?如果情况确实如此,且cli是字符** 然后你可以保持它与你拥有它的方式相似,即:

cli[8] = NULL;

cli[7] = igFlag;
execv(cli[0], cli);

cli[7] = faFlag;
execv(cli[0], cli);

cli[7] = giFlag;
execv(cli[0], cli);
这里的问题是当faInput[7]=faFlag执行时,它会改变 I输入[7]以匹配,然后当执行giInput[7]=giFlag时, 这三个数组都有匹配的[7]指针

您没有复制cli,而是将每个字符*都设置为指向cli。因此,igInput[7]==faInput[7]==giInput[7]==cli[7]

如果不使用meagar的getopt建议,请为ig/fa/gaInput和memcpy cli分配内存

编辑:哦,等等,你是想把这些参数传给别的东西,而不是读入它们?cli像某种argv吗?如果情况确实如此,且cli是字符** 然后你可以保持它与你拥有它的方式相似,即:

cli[8] = NULL;

cli[7] = igFlag;
execv(cli[0], cli);

cli[7] = faFlag;
execv(cli[0], cli);

cli[7] = giFlag;
execv(cli[0], cli);

你把一件小事变成了一场噩梦。我的理解是,您希望运行该命令3次,使用-i、-s或-g取决于迭代。这样做:

char opt[] = "-i", *cmd[] = {
    "decision", "-train", "voting-train-1", "-test", "voting-test-1",
    "-out", "voting.out", opt, 0
};
/* use first command line */
opt[1] = 's';
/* use second command line */
ops[1] = 'g';
/* use third command line */

你把一件小事变成了一场噩梦。我的理解是,您希望运行该命令3次,使用-i、-s或-g取决于迭代。这样做:

char opt[] = "-i", *cmd[] = {
    "decision", "-train", "voting-train-1", "-test", "voting-test-1",
    "-out", "voting.out", opt, 0
};
/* use first command line */
opt[1] = 's';
/* use second command line */
ops[1] = 'g';
/* use third command line */

您是否考虑过使用getopt和getopt_long?这些是处理命令行选项的标准方法。^^应该是答案。因为这就是答案。你没有抓住问题的关键——我不是在问解析命令行输入,而是在构建它们。getopt解析CLI,但我不知道它如何适合这里是的,我刚刚意识到这一点。你可以保持沉默
代码类似于您在更改标志后执行exec或调用任何东西时所使用的代码,您不必为了重用它而复制整个cli。编辑了我的帖子。你是如何解决你的问题的?你考虑过使用getopt和getopt_long吗?这些是处理命令行选项的标准方法。^^应该是答案。因为这就是答案。你没有抓住问题的关键——我不是在问解析命令行输入,而是在构建它们。getopt解析CLI,但我不知道它如何适合这里是的,我刚刚意识到这一点。如果在更改标志后执行exec或调用任何东西,则可以使代码与现有代码类似,而不必复制整个cli来重用它。编辑了我的帖子。你是如何解决你的问题的?或者,因为这是Unix,而不是mallocation和memcping,只是strdup。哦,是的,很好的旧strdup,如果他想复制整个cli,他可以这样做。做得好。或者,因为这是Unix,而不是mallocation和memcpying,只是strdup。哦,是的,很好的旧strdup,如果他想复制整个cli,他可以这样做。干得好。我选择了你的答案,因为你最接近我的最终解决方案。请参阅我的编辑以获得澄清我选择了你的答案,因为你最接近我的最终解决方案。请参阅我的编辑以获得澄清