我试图遍历某些输入(即命令和参数),将输入拆分为单独的字符串,然后将该输入传递给execvp()
。
我遇到麻烦了,因为execvp()
希望将(char*, char*[])
作为其参数。我传入了(char*, char[][])
,我以为是同一回事,但并不喜欢它。
我会使用char*[]
,但是在运行之前我不知道字符串有多大,所以这就是我不使用它的原因。因此很明显,如果我使用char*[]
,则在尝试访问char*
的元素时会遇到段错误。
这是代码段
//input
char *line = "echo hello there what is";
int count = 0;
//store arguments
char args[6][10];
int argCount = 0;
//store temp string from input
char temp[100];
int tempCount = 0;
//word(string) size
int wordSize = 0;
/*
Here I iterate over the input, storing each string I find in args
all the above variables help me do that.
*/
execvp(args[0], args);
printf("Error: It didnt work\n");
希望这是一个明确且有效的问题,请让我知道是否要添加将代码转换为args
的代码。
答案 0 :(得分:3)
char
数组的数组与指向char
数组的指针的数组不同。 execvp()
希望后者以空指针作为最后一个元素,传递前者具有未定义的行为。
您必须构造一个指针数组,该指针数组是从堆中分配的,或者是使用自动存储(在堆栈中的 )定义的,并使用指向参数字符串的指针对其进行初始化,并将此数组传递给{{1} }。
还要注意,execvp()
既是Shell内部命令,也是路径中的可执行文件。
以下是对您的代码片段进行了相应的修改(没有解析代码,仍然由您编写):
echo
答案 1 :(得分:1)
您可以使用两个数组:
char real_args[6][10]; // Six strings of up to nine characters each
...
char *args[] = {
real_args[0],
real_args[1],
real_args[2],
real_args[3],
real_args[4],
real_args[5],
NULL // Must be terminated by a null pointer
};
使用real_args
作为实际参数,然后将args
传递给execvp
。
答案 2 :(得分:0)
好吧,我弄清楚了如何使用char*[]
而不是char[][]
并将其成功地放入execvp()
中。
以下代码的注释:我跟踪在wordSize
中迭代当前字符串的时间。
//input
char* line = "echo hello there what is";
int count = 0;
//store arguments
char* args[10];
int argCount = 0;
//store temp string from input
char temp[100];
int tempCount = 0;
//word size
int wordSize = 0;
while(line[count] != '\0')
{
if (line[count] == ' ' || line[count + 1] == '\0')
{
/*
As I don't know how big each string will be, I can
allocate it here as I know how big the string is through wordSize
*/
args[argCount] = malloc(sizeof(char)*(wordSize +1));
.
.
.
}
}
//terminate args with 0
args[argCount] = 0;
execvp(args[0], args);
printf("Error: It didnt work\n");