我正在尝试将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的主要功能是:
int dcraw_main (int argc, const char **argv);问题是,如果有和奇数的参数(在所示的例子中有5个),我得到:
Terminated due to signal: ABORT TRAP (6)
errorReturn = 0如果有偶数的参数,我就不明白这个错误。
我正在CodeRunner中运行上面的代码。当我在应用程序中嵌入代码时,main()被重命名,因为应用程序中已经有了main()函数。然而,它表现出类似的行为,并挂起程序。
用这种方式模拟命令行程序的输入有问题吗?蒂娅。
发布于 2018-12-08 06:15:19
参数数组以空结尾,字符串的字符必须是而不是 be const -C程序可以修改传递给main的参数。
例如,请使用此方法(注意,当这些参数被strdup复制到可变字符串时,需要对其中的每个参数进行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复合文字,不泄漏内存,而是块作用域!):
#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复合初始化程序具有块生存期,因此在当前{ ... }块结束后它将不可用。
在您的例子中,由于它适用于一些参数,它将提示缺少空终止符是原因,但在一般情况下,这是您想要做的。
https://stackoverflow.com/questions/53680048
复制相似问题