首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令行输入的仿真

命令行输入的仿真
EN

Stack Overflow用户
提问于 2018-12-08 06:08:57
回答 1查看 301关注 0票数 0

我正在尝试将dcraw代码嵌入到我的应用程序中。dcraw是c中的原始图像处理命令行程序。为了尽量减少对dcraw的更改,我想我将模拟命令行输入到dcraw的主函数,并重命名主函数。代码如下:

代码语言:javascript
复制
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的主要功能是:

代码语言:javascript
复制
int dcraw_main (int argc, const char **argv);

问题是,如果有和奇数的参数(在所示的例子中有5个),我得到:

代码语言:javascript
复制
Terminated due to signal: ABORT TRAP (6)
errorReturn = 0

如果有偶数的参数,我就不明白这个错误。

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

用这种方式模拟命令行程序的输入有问题吗?蒂娅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-08 06:15:19

参数数组以空结尾,字符串的字符必须是而不是 be const -C程序可以修改传递给main的参数。

例如,请使用此方法(注意,当这些参数被strdup复制到可变字符串时,需要对其中的每个参数进行strdup):

代码语言:javascript
复制
#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复合文字,不泄漏内存,而是块作用域!):

代码语言:javascript
复制
#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复合初始化程序具有块生存期,因此在当前{ ... }块结束后它将不可用。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53680048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档