2016-05-17 25 views
1
fgets(command, BUFFSIZE, stdin); 
command[strlen(command)-1] = '\0'; 

char *p = strtok(command, " "); 
char *command_tok[BUFFSIZE]; 
int i = 0; 
while (p) { 
    command_tok[i++] = p; 
    p = strtok(NULL, " "); 
} 


char *commands[] = {*command_tok, NULL}; 
execvp(command_tok[0], commands); 

我尝试获取用户输入,将其标记并将命令和参数存储在数组中以将其传递给execvp()。但是,参数从来没有读过。如果输入是“ls -l”,它总是作为“ls”执行。令牌化execvp()中的用户输入c

回答

3

这条线:

// 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

0

您提供给commands的数组完全由两个元素组成:第一个元素command_tok指向NULL。编译器应该如何知道你指的是数组command_tok的所有元素,以及它应该如何确定它的大小?

1

的-l后你没有空间,所以,你的选择代替了“ -l \ n'作为参数。所以你必须使用'\ n'也是在strtok函数的分隔符中。

下面的代码将按照您的预期工作。

fgets(command, BUFFSIZE, stdin); 
command[strlen(command)-1] = '\0'; 

char *p = strtok(command, " \n"); 
char *command_tok[BUFFSIZE]; 
int i = 0; 
while (p) { 
    command_tok[i++] = p; 
    p = strtok(NULL, " \n"); 
} 
command_tok[i] = NULL; 

execvp(command_tok[0], command_tok); 

当您使用fgets读取输入时,如果它不是EOF,则最后有\ n。所以,使用这个你可以选择参数。