gpt4 book ai didi

c - 模拟命令行输入

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:20 25 4
gpt4 key购买 nike

我正在尝试将 dcraw 代码嵌入到我的应用程序中。 dcraw是c语言的原始图像处理命令行程序。为了尽量减少对 dcraw 的更改,我想我会模拟命令行输入到 dcraw 的主要功能并重命名主要功能。代码如下:

int main() {
int errorReturn;
const char *argArray[5];
argArray[0] = "dcraw";
argArray[1] = "-v";
argArray[2] = "-w";
argArray[3] = "-T";
argArray[4] = "/path/to/file";
errorReturn = dcraw_main (5, (const char **)argArray);
printf("errorReturn = %d\n", errorReturn);
return errorReturn;
}

dcraw main 函数现在在哪里:

int dcraw_main (int argc, const char **argv);

问题是,如果有奇数个参数(示例中为 5 个),我得到:

Terminated due to signal: ABORT TRAP (6)
errorReturn = 0

如果有偶数个参数,我不会得到那个错误。

我在 CodeRunner 中运行上面的代码。当我将代码嵌入我的应用程序时,main() 被重命名,因为应用程序中已经有一个 main() 函数。然而,它表现出类似的行为并挂起程序。

这样模拟命令行程序输入有问题吗?TIA。

最佳答案

参数数组以 null 结尾,字符串的字符必须不是 const - C 程序可以修改传递给 main 的参数

例如使用这个(请注意,您随后需要释放这些参数中的每一个,因为它们被 strdup 复制到可变字符串中):

#define arg(a) strdup(a)

char *argArray[] = {
arg("dcdraw"),
arg("-v"),
arg("-w"),
arg("-T"),
arg("/path/to/file"),
NULL
};
int argc = sizeof argArray / sizeof *argArray - 1;

或者这个(C99 复合字面量,不泄漏内存,但是 block 作用域!):

#define arg(a) (char[]){a}

char *argArray[] = {
arg("dcdraw"),
arg("-v"),
arg("-w"),
arg("-T"),
arg("/path/to/file"),
NULL
};
int argc = sizeof argArray / sizeof *argArray - 1;

C99 复合初始化器具有 block 生命周期,因此在当前 { ... } block 结束后它将不可用。


在您的情况下,由于它适用于一些参数,因此它会暗示缺少 NULL 终止符是原因,但在一般情况下,这就是您想要做的。

关于c - 模拟命令行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53680048/

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