用C语言中的strtok解析输入

用C语言中的strtok解析输入,c,parsing,strtok,execvp,C,Parsing,Strtok,Execvp,我有一个类中的项目,需要我用C构建一个简单的shell。我是C新手,现在面临的问题是在发送命令执行之前正确解析命令。我知道有几种不同的方法可以做到这一点,但我们需要使用strtok,我似乎有一些问题 以下是我的全部代码: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> int parseCommands(char *command,

我有一个类中的项目,需要我用C构建一个简单的shell。我是C新手,现在面临的问题是在发送命令执行之前正确解析命令。我知道有几种不同的方法可以做到这一点,但我们需要使用strtok,我似乎有一些问题

以下是我的全部代码:

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

int parseCommands(char *command, char **args){
    int pos = 0;
    printf("%s\n", command);
    char *readCommand = NULL;
    char delims[] = {" \n"};
    readCommand = strtok(command, delims);
    while(readCommand != '\0'){
        printf("%s\n", readCommand); 
        strcpy(args[pos], readCommand);
        printf("%s\n", args[pos]);
        readCommand = strtok(NULL, delims);
        pos++;
    }
    return pos;
}

int executeCommand(char **args){
    pid_t pID;
    switch(pID = fork()){
        case 0:
            execvp(args[0], args);
            perror("Some sort of exec error");
            return -1;
        case -1:
            perror("Could not even fork");
            return -2;
        default:
            wait(NULL);
            return 0;
    }
}

void main(){

    char wd[256];
    char input[256];
    char *args[15];

    char strDelims[] = ";";
    char *readInput = NULL;

    while(1){

        getcwd(wd, sizeof wd);
        printf("mysh: %s> ", wd);
        fgets(input, sizeof input, stdin);

        readInput = strtok(input, strDelims);

        int numArgs;
        numArgs = parseCommands(readInput, args);
            if(numArgs < 1)
                printf("There was a problem parsing the command\n");

            if(strcmp(args[0], "cd") == 0){
                printf("%d\n", numArgs);
                if(numArgs > 1){
                    if((chdir(args[1])) < 0){
                        perror("I'm afraid I can't let you do that Dave\n");
                    }
                }
                else{
                    if((chdir(getenv("HOME"))) < 0){
                        perror("Can't go home\n");
                    }
                }
            }
            else if(strcmp(readInput, "quit") == 0){
                break;
            }
            else{
                if((executeCommand(args)) != 0)
                    printf("Problem executing the command\n");
            }
            readInput = strtok(input, strDelims);
    }

}
我只是觉得奇怪的是,
cd
似乎工作得相当好,但它实际上并不喜欢其他任何东西。这让我觉得以后(但在numArgs的printf之前?)会出问题。仅供参考,我们被告知每个命令不能超过15个参数或256个字符

这已经让我沮丧了一段时间,所以对这个特定问题的任何帮助都将是非常棒的(我意识到其中还有其他错误或糟糕的代码部分,但我想自己解决这些问题)。非常感谢!:)

一些指针

通常strtok共享一个静态缓冲区,所以当您先调用strtok之后 你的解析函数,然后在后面的解析函数中,你可能会搞砸 之前缓冲区里有什么

您也不为args[]分配空间,只声明一个指针数组
(char*args[15])
但是,在解析函数中,对指针指向的对象进行strcpy。 您需要分配一个缓冲区,分配给args[i],然后将字符串复制到其中

所以不是

strcpy(args[pos], readCommand);


家庭作业标签已弃用。请不要用它。
strcpy(args[pos], readCommand);
args[pos] = strdup(readCommand);