c - 模拟命令行输入

标签 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 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/

相关文章:

c - 程序打印 Windows 路径?

java - 为什么程序没有继续进行

带有数据文件的命令行参数

command-line-arguments - 如何管理 docker run 命令中的命令行参数?

c - 在 Linux 中隐藏 C 程序的命令行参数

c - 下面的 bash 程序调用做了什么?

命名空间前缀解析和优化级别依赖性中带有 extern "C"的 C++

CodeBlocks 在修改代码后不刷新我的程序

c - Pthread_join() 卡在线程数组上

c - 在 C 中操作字符串时,仅在发布配置中出现段错误