这条线:
// makes a two element array
char *commands[] = {*command_tok, NULL};
是错误的。
它创建一个由两个元素组成的新数组,其中第一个元素是command_tok [0]。相反,你想要的是
command_tok[i] = NULL
execvp(command_tok[0], command_tok);
而且
command[strlen(command)-1] = '\0'
是荒谬的:strlen的通过搜索空字节,然后您可以设置为空再次发现长度。
这里是我的版本:
#include <string.h>
#include <unistd.h>
#include <cstdio>
static const int BUFFSIZE=200;
int main(int argc, char* argv[]) {
char command[BUFFSIZE] = { 0 };
fgets(command, BUFFSIZE, stdin);
// remove trailing new line if present
commmand[strcspn(command, "\n")] = 0;
char *p = strtok(command, " ");
char *command_tok[BUFFSIZE];
int i = 0;
while (p) {
command_tok[i++] = p;
p = strtok(NULL, " ");
}
command_tok[i] = NULL;
execvp(command_tok[0], command_tok);
}
一衬垫去除后新生产线来自Removing trailing newline character from fgets() input