execvp和参数类型-ansi c
我在使用execvp和参数类型-ansi c,c,strtok,argv,execvp,C,Strtok,Argv,Execvp,我在使用execvp()时遇到问题execvp()期望typechar*const*作为第二个参数。我想解析传递给应用程序的参数(在argv中)并生成该类型的数组。例如,用户正在调用二进制文件,如下所示: ./myapp "ls -a -l" 然后我用它制作以下数组: {"ls", "-a", "-l", NULL} 现在,我的代码如下所示: const char* p[10]; char temp[255] = "ls -a -l"; p[0] = strtok(
execvp()
时遇到问题execvp()
期望typechar*const*作为第二个参数。我想解析传递给应用程序的参数(在argv
中)并生成该类型的数组。例如,用户正在调用二进制文件,如下所示:
./myapp "ls -a -l"
然后我用它制作以下数组:
{"ls", "-a", "-l", NULL}
现在,我的代码如下所示:
const char* p[10];
char temp[255] = "ls -a -l";
p[0] = strtok(temp, " ");
for(i=0; i<9; i++) {
if( p[i] != NULL ) {
p[i+1] = strtok(NULL, " ");
} else {
break;
}
}
const char*p[10];
字符温度[255]=“ls-a-l”;
p[0]=strtok(温度,“”);
对于(i=0;i而言,问题在于execvp
的第二个参数是char*const*
,它是一个“指向非常量数据的常量指针的指针”。您试图向它传递一个const char**
,它是一个“指向常量数据的指针”
解决此问题的方法是使用char**
而不是const char**
(因为对于任何类型的X(但仅在指针的顶层),始终允许将“指向X的指针”转换为“指向const
X的指针”):
请注意,如果确实需要插入const char*
参数,只要不修改它们,就可以强制转换它们。尽管exec*
函数族的参数声明为非const
,但它们永远不会修改它们(请参阅)。这里的基本原理解释了为什么它们被声明为非常量
您可以使用char*p[10]
分解一下:
char*const*p
的意思是“指向非常量char的常量指针的非常量指针”--也就是说,p
是可写的,p[0]
是不可写的,p[0][0]
是可写的。在代码中,你在哪里调用execvp()
?在strtok()中test
变量做什么
我猜temp
变量应该在哪里。您在哪里定义了test
变量?当然test是一个temp,我刚刚写了一个例子。我正在调用execvp(p[0],p)…问题属于p类型。无论如何,问题已解决。谢谢。顺便说一句:您的循环逻辑有问题。如果输入字符串中碰巧有9个或更多令牌,则p[]数组不会有最终的空指针。Ofc我知道。这只是一个例子。在我的代码中,我将使用malloc/realloc。谢谢。你知道它是否安全吗?是的。根据POSIX 2008规范,没有任何exec
函数会写入字符串;char*const*
用于兼容性(而不是更正确的const char*const*
)。哇,这是一个出人意料的令人困惑的问题的好答案。感谢POSIX参考,否则这个合理的荒谬似乎是完全不合理的!
char* p[10];
p[0] = ...;
// etc.