C 命令行输入的模拟

C 命令行输入的模拟,c,command-line-arguments,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]

我正在尝试将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个),我会得到:

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

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

以这种方式模拟命令行程序的输入是否有问题?
TIA.

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

例如,请注意,当这些参数被
strdup
复制到可变字符串中时,需要
free
释放它们:

或者这个(C99复合文字,不泄漏内存,但块作用域!):

C99复合初始值设定项具有块生存期,因此在当前
{…}
块结束后,它将不可用



在您的情况下,由于它适用于一些参数,因此它会提示缺少NULL终止符是原因,但在一般情况下,这就是您希望执行的操作。

参数数组以NULL终止,字符串的字符必须not
const
-C程序可以修改传递到
main
的参数

例如,请注意,当这些参数被
strdup
复制到可变字符串中时,需要
free
释放它们:

或者这个(C99复合文字,不泄漏内存,但块作用域!):

C99复合初始值设定项具有块生存期,因此在当前
{…}
块结束后,它将不可用



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

可能值得一行或两行代码来识别宏中的复合文字。可能会让新的C程序员感到困惑。谢谢,这很有效,而且它比我的原始代码更易于使用和修改。对于以后阅读本文的人,请在后台将内存存储在堆上,因此如果不释放它,就会出现内存泄漏。诚然,这些都是计划中的小漏洞。第二种方法:char[]{a}不会泄漏,或者,您可以使用我在问题中提出的语法,显式添加NULL作为数组的最后一个元素。@JimMerkel strdup的存在并不是为了只添加NULL-它的存在是因为命令行参数需要可修改。可能值一行或两行代码来标识宏中的复合文字。可能会让新的C程序员感到困惑。谢谢,这很有效,而且它比我的原始代码更易于使用和修改。对于以后阅读本文的人,请在后台将内存存储在堆上,因此如果不释放它,就会出现内存泄漏。诚然,这些都是计划中的小漏洞。第二种方法:char[]{a}不会泄漏,或者您可以使用我在问题中提出的语法,显式添加NULL作为数组的最后一个元素。@JimMerkel strdup的存在不是为了只添加NULL-它的存在是因为命令行参数需要修改。
Terminated due to signal: ABORT TRAP (6)
errorReturn = 0
#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;
#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;