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

Unable to pass a user input array to execvp

这是我的输入函数:

    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]='[=10=]';

    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]='[=10=]';
            execvp(cmd[0],cmd);
            token1 = strtok_r(NULL, ";", &end_str1);
        }
    }
    free(buffer);

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

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

这是因为您向函数 execvp 传递了错误的参数。

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

它的声明是这样的:

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

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

my cmd array is a [char] **ptr

不,不是。

它是一个 char[10][100],当传递给 execvp() 时,它会衰减到指向其第一个元素的指针,即 char(*)[101]

这里还有一个 "off-by-one" 错误:

cmd[wordcnt+1][0]='[=10=]';

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);

Also^2 getline() returns 一个以 0 结尾的 char 数组(一个 "string")。不需要这个

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