Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换C中的字符*?_C - Fatal编程技术网

如何替换C中的字符*?

如何替换C中的字符*?,c,C,我目前正在编写一个用于学校目的的shell,我有一个问题,即如果我编写命令“history”,那么之后的“exit”命令将不起作用。如果你能帮助我,我将非常高兴。 这是我的密码: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #define MAX_INPUT 256 static

我目前正在编写一个用于学校目的的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;
}
#包括
#包括
#包括
#包括
#包括
#定义最大输入256
静态字符cwd[100];
void myprintf(字符*文本){
文本!=空?
printf(“%s@rash:%s:%s\n“,getenv(“用户”),getcwd(cwd,sizeof(cwd)),文本):
printf(“%s@rash:%s:,getenv(“用户”),getcwd(cwd,sizeof(cwd));
}
void errprintf(字符*文本){
myprintf(空);
printf(“无法运行%s\n”,文本);
}
静态字符*argv[256];
静态int-argc;
静态int-pid=0;
档案*历史;
无效解析输入(字符*输入){
输入=strtok(输入“\n”);
对于(argc=0;argc我认为这里
while(input!=NULL?strncmp(input,“exit”,strlen(input))!=0:1{

它将是strlen(“exit”)
我想这里是
而(input!=NULL?strncmp(input,“exit”,strlen(input))!=0:1{

它将是strlen(“退出”)

  • “输入”变量仅在while循环中取值:

    fgets(input, MAX_INPUT, stdin);
    parseInput(input);
    
  • parseInput多次使用strtok函数。strtok修改参数字符串,因此在您将其与“exit”进行比较时,不清楚它将包含什么值
  • 在调用strtok之前尝试复制“输入”字符串。尝试在循环末尾添加调试字符串,以明确输入字符串中的值

  • “输入”变量仅在while循环中取值:

    fgets(input, MAX_INPUT, stdin);
    parseInput(input);
    
  • parseInput多次使用strtok函数。strtok修改参数字符串,因此在您将其与“exit”进行比较时,不清楚它将包含什么值

  • 在调用strtok之前,尝试复制“输入”字符串。尝试在循环末尾添加调试字符串,以明确输入字符串中的值。

    欢迎使用堆栈溢出!您介意创建一个吗?我没有看到对
    程序()的任何调用
    。抱歉,意外删除了它,但我现在添加了它。您的
    malloc
    调用错误。您有一个
    char
    数组,所以您想要
    sizeof(char)
    ,而不是
    sizeof(char*)
    。欢迎使用堆栈溢出!您介意创建一个吗?我没有看到任何对
    程序()
    。抱歉,意外删除了它,但我现在添加了它。您的
    malloc
    调用错误。您有一个
    char
    数组,因此您需要
    sizeof(char)
    ,而不是
    sizeof(char*)