【发布时间】:2016-03-06 18:29:26
【问题描述】:
所以我有一个我无法解决的问题。 我正在编写一个通过管道执行一些操作系统功能的 C 程序。使用 execvp(const char *file, char *const argv[]); 完成执行。
在我的主函数中,我想将除第一个字符数组之外的整行传递给程序 (argv),并将其传递给 grep。目前一切正常,但我不断收到警告:
warning: initialization from incompatible pointer type [enabled by default]
const char* grep = argv;
^
我的代码如下所示。在子句if(1 < argc) 中,我希望能够发送argv,第一个帖子修改为newPipeline,格式与printenv 相同,排序和更少。
int main(int argc, char** argv, char **envp){
const char* printenv[] = {"printenv", NULL, NULL};
const char* sort[] = {"sort", NULL, NULL};
const char* less[] = {"less", NULL, NULL};
if(1<argc){
argv[0] = "grep";
const char* grep = argv;
const char* const* commands[] = {printenv, sort, grep, less, NULL};
newPipeline((char* const**)commands, 0, STDIN_FILENO);
}
//FROM HERE ON IT WORKS
else{
const char* const* commands[] = {printenv, sort, less, NULL};
newPipeline((char* const**)commands, 0, STDIN_FILENO);
}
if(signal(SIGCHLD, SIG_IGN) == SIG_ERR){
perror("A problem with the children");
}
exit(0);
}
我知道指针类型是错误的。我应该为grep 构建一个全新的数组,还是应该像我现在尝试做的那样,将指针转换为正确类型的指针。如果是后者,那将是哪些指针?
【问题讨论】:
-
您应该将您的数组(argv)复制到另一个中以使用
-
argv不是const。你可以随意修改它(grep也是如此),所以每次传递它时都要复制一份。 -
您想将 argv 的元素连接成一个由空格分隔的字符串,对吗?这就是你在这种情况下所缺少的
-
@someguy。没有。只需按原样传递向量即可。
-
@Mad Physicist:那么没有意义。
grep是字符串,不是数组字符串。