命令行输入模拟

时间:2018-12-08 06:08:57

标签: c command-line-arguments

我正在尝试将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。

1 个答案:

答案 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终止符是原因,但是在一般情况下,这是您想要执行的操作。