将char [] []传递给execvp时出现问题

时间:2019-05-04 09:52:14

标签: c

我试图遍历某些输入(即命令和参数),将输入拆分为单独的字符串,然后将该输入传递给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的代码。

3 个答案:

答案 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");