无法将用户输入数组传递给execvp

时间:2016-09-24 09:12:20

标签: c exec strtok

这是我的输入功能:

    int i,j,n,len,c;
    char *buffer = 0;
    size_t bufsize = 0;
    ssize_t characters;

    characters = getline(&buffer, &bufsize, stdin);

    len = strlen(buffer);
    buffer[len-1]='\0';

    if (characters > 0)
    {
        char *end_str1;
        char *token1 = strtok_r(buffer, ";", &end_str1);
        int count = 0, wordcnt;
        while (token1 != NULL)
        {
            char cmd[10][101];
            memset(cmd,0,sizeof(cmd));
            wordcnt = 0;
            char *end_str2;
            count++;
            char *token2 = strtok_r(token1, " ", &end_str2);
            while (token2 != NULL)
            {
                n = strlen(token2);
                strncpy(cmd[wordcnt],token2,n);
                wordcnt++;
                token2 = strtok_r(NULL, " ", &end_str2);
            }
            cmd[wordcnt+1][0]='\0';
            execvp(cmd[0],cmd);
            token1 = strtok_r(NULL, ";", &end_str1);
        }
    }
    free(buffer);

唯一的警告是指针类型不兼容,但是我的cmd数组是** ptr,所以我不明白是什么问题。

我尝试将其等同于** k,然后将其传递给execvp。没工作。 我尝试将cmd更改为** cmd,我认为我在那里做错了,因为它应该有效,但事实并非如此。

2 个答案:

答案 0 :(得分:1)

  

我的[char] **ptr数组是char[10][100]

不,不是。

它是execvp(),当传递给char(*)[101]时,它会衰减到指向其第一个元素的指针,即cmd[wordcnt+1][0]='\0';

你也有一个"一个一个"错误在这里:

wordcnt

#define MAX_NO_OF_CMD_ELEMENTS (10) ... char * cmd[MAX_NO_OF_CMD_ELEMENTS + 1]; /* 1+ for the NULL-terminator */ size_t wordcnt = 0; char *end_str2; count++; token2 = strtok_r(token1, " ", &end_str2); while ((NULL != token2) && (MAX_NO_OF_CMD_ELEMENTS > wordcnt)) /* Prevent writing out of `cmd`'s bounds. */ { cmd[wordcnt] = token2; wordcnt++; token2 = strtok_r(NULL, " ", &end_str2) } cmd[wordcnt] = NULL; execvp(cmd[0], cmd); 已在令牌化循环内增加。

你想要的是:

getline()

同样^ 2 0已经返回char - 已终止的 len = strlen(buffer); buffer[len-1]='\0'; - 数组("字符串")。不需要这个

{{1}}

答案 1 :(得分:0)

因为您将错误的参数传递给函数execvp

execvp(cmd[0],cmd); //this line

它的声明是这样的:

extern int execvp (const char *__file, char *const __argv[])

并且你传递的是char(*)[101]类型的参数,它期望char *, const*因此抛出不兼容的错误。