我正在尝试将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()函数。但是,它表现出类似的行为并挂起了程序。
以这种方式模拟命令行程序的输入是否存在问题? TIA。
答案 0 :(得分:2)
参数数组以空值结尾,并且字符串的字符必须不为const
-允许C程序修改传递给main
的参数。 / p>
例如,使用以下命令(注意,当这些参数由free
复制到可变字符串中时,您需要 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复合初始化程序具有块生存期,因此在当前{ ... }
块结束后将不可用。
在您的情况下,由于它适用于一定数量的参数,因此它暗示缺少NULL终止符是原因,但是在一般情况下,这是您想要执行的操作。