Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
execvp和参数类型-ansi c_C_Strtok_Argv_Execvp - Fatal编程技术网

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.