gpt4 book ai didi

argc/argv 中的命令行解析

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:28 26 4
gpt4 key购买 nike

我有以下代码:

void parse(char *commandLine) {
int rc = 0;
int argc = 0;
char *cmdLine;
char *argv[MAX_ARGS];
filename = NULL;
stdoutFilename = NULL;
stderrFilename = NULL;
cmdLine = strdup(commandLine);
char *param = strtok(cmdLine, " ");
while (param && argc < MAX_ARGS) {
argv[argc++] = param;
param = strtok(NULL, " ");
printf("%s\n", argv[argc-1]);
}
free(cmdLine);
scanOptions(argc, argv);
printf("Filename %s\n", filename);

...

void scanOptions(int argc, char *argv[]) {
int c ;
while ((c = getopt (argc, argv, "Df:e:o:")) != -1) {
switch (c) {
case 'D': __debug = 1; break;
case 'f': filename = strdup(optarg); break;
case 'o': stdoutFilename = strdup(optarg); break;
case 'e': stderrFilename = strdup(optarg); break;
default: fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt);
}
}
}

filename、stdoutFilenamestderrFilename全局变量。如果我将解析方法调用为:

parse("-ftest/testfile.txt") the variable filename is not set and the call to 
printf("Filename %s\n", filename); prints "Filename (null)".

这有什么问题吗?

最佳答案

有几处错误,可能是也可能不是问题的原因:

释放内存的使用

free(cmdLine);
scanOptions(argc, argv);

您不能在此处释放 cmdLine,因为您的 strtok() 调用会将 cmdLine 内的指针分配给您的 argv。 free() 它在 scanOptions() 之后,但如果你直接保存任何 optarg 指针,它们将指向你有 free() 的空间 - 你使用 strdup() 所以你在你的情况下是安全的。

重置 getopt()

如果您之前调用过 getopt,则需要重置它的一些变量以便它可以再次扫描(有关解释,请参阅 getopt 联机帮助页)。你需要做的:

optind = 0;

argv 中的索引错误argv 中的第一个索引按照惯例是程序名称,而不是任何程序参数。因此,请确保您的 argv[0] 不是您的任何参数。但它必须是一个有效的字符串,而不是例如一个 NULL 指针。

argv[1] 应该是第一个参数。

给argv添加一个sentiel

main() 的传统 argv 以 NULL 指针结尾,您的模拟 argv 也应该如此。在 while 循环之后,执行

argv[argc] = NULL;

关于argc/argv 中的命令行解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16687258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com