我试图使用fgets将输入从strtok中分离出来,并将结果存储在一个数组中,即newArgs,这样我就可以调用execvp并基本上执行fgets传递的输入。
例如,ls -la将映射到/bin/ls -la并正确执行。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char * argv[])
{
    char buff[1024];
    fgets(buff, 1024, stdin);
    buff[strcspn(buff, "\n")] = 0;
    printf("%s\n", buff);
    printf("%d\n", strlen(buff));
    char *newArgs[30];
    char *token;
    char delim[2] = " ";
    token = strtok(buff, delim);
    int i = 0;
    while(token != NULL)
    {
        if(newArgs[i])
        {
            sprintf(newArgs[i], "%s", token);
            printf("%s\n", newArgs[i]);
        }
        token = strtok(NULL, delim);
        i++;
    }
    execvp(newArgs[0], newArgs);

    return 0;
}

尽管我正在检查newArgs[i]的存在,但仍然有一个分割错误,这有点奇怪。有什么问题吗?

最佳答案

我看到的问题:
您正在使用未初始化的值newArgs[i]你有:

char *newArgs[30];

这是一个未初始化指针数组然后,继续使用它们作为:
if(newArgs[i])

这就是不确定行为的原因可以通过将指针初始化为空来解决这个问题。
char *newArgs[30] = {};

在调用之前您没有为newArgs[i]分配内存
sprintf(newArgs[i], "%s", token);

这也是未定义行为的原因您可以使用以下方法解决此问题:
newArgs[i] = strdup(token);

传递给execvp的参数列表必须包含空指针。
来自http://linux.die.net/man/3/execvp(强调我的):
execv()execvp()execvpe()函数提供指向以空结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表根据约定,第一个参数应指向与正在执行的文件关联的文件名指针数组必须以空指针结束。
你错过了最后一个要求您需要确保newArgs的一个元素是空指针如果将指针初始化为空,这个问题就会消失。

10-04 20:21