如何在C中替换char *?

时间:2016-03-21 05:24:24

标签: c

我目前正在为学校目的编写一个shell,我遇到的问题是,如果我写命令“history”,之后的“exit”命令不起作用。如果你能帮助我,我会非常高兴。 这是我的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>


#define MAX_INPUT 256

static char cwd[100];

void myprintf(char *text) {
    text != NULL ?
    printf("%s@rash:%s: %s\n", getenv("USER"), getcwd(cwd, sizeof(cwd)), text) :
    printf("%s@rash:%s: ", getenv("USER"), getcwd(cwd, sizeof(cwd)));
}

void errprintf(char *text) {
    myprintf(NULL);
    printf("Couldn't run %s\n", text);
}

static char *argv[256];
static int argc;
static int pid = 0;

FILE *fhistory;

void parseInput(char *input) {
    input = strtok(input, "\n");
    for (argc = 0; argc < MAX_INPUT; argc++) {
        argv[argc] = NULL;
    }
    argc = 0;
    fprintf(fhistory, "%s\n", input);
    char *param = strtok(input, " ");
    while (param) {
        argv[argc++] = param;
        param = strtok(NULL, " ");
    }
}

void signalHandler(int sign) {
    switch (sign) {
        case SIGINT: {
            if (pid != 0) {
                kill(pid, SIGKILL);
                pid = 0;
            }
            break;
        }
        case SIGCHLD: {
            if (pid != 0) {
                kill(pid, SIGKILL);
                pid = 0;
            }
            break;
        }
    }
}

int programs() {
    if (!strcmp(argv[0], "exit")) {
        return -1;
    }
    if (!strcmp(argv[0], "cd")) {
        chdir(argv[1] == NULL ? getenv("HOME") : argv[1]);
    } else {
        pid = fork();
        switch (pid) {
            case -1: {
                myprintf("Erectile Dysfunction!");
                break;
            }
            case 0: {
                if (!strcmp(argv[0], "history")) {
                    system("cat .rash_history.txt");
                } else {
                    execvp(argv[0], argv);
                    errprintf(argv[0]);
                }
                break;
            }
            default: {
                waitpid(pid, NULL, 0);
                signal(SIGCHLD, signalHandler);
                return 0;
            }
        }
    }
    return 1;
}

int main(void) {
    signal(SIGINT, signalHandler);
    char *input = NULL;
    myprintf("Welcome to rash!");
    fhistory = fopen(".rash_history.txt", "a");
    while (input != NULL ? strncmp(input, "exit", strlen(input)) != 0 : 1) {
        myprintf(NULL);
        input = (char *) malloc(sizeof(char *) * MAX_INPUT);
        int j;
        for (j = 0; j < MAX_INPUT; j++) {
            input[j] = '\0';
        }
        fgets(input, MAX_INPUT, stdin);
        parseInput(input);
        if (*(input) != '\n') {
            programs();
        }
    }
    fclose(fhistory);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

我想这里while (input != NULL ? strncmp(input, "exit", strlen(input)) != 0 : 1) {

它将是strlen("exit")

答案 1 :(得分:0)

  1. “input”变量仅在while循环内取值:

    fgets(input, MAX_INPUT, stdin);
    parseInput(input);
    
  2. parseInput使用strtok函数几次。 strtok修改了参数字符串,因此在将它与“exit”进行比较时,它不会清楚它将包含的值。
  3. 尝试在调用strtok之前复制“input”字符串。尝试在循环结束时添加调试字符串,以明确输入字符串中的值。