gpt4 book ai didi

c - 解析器在 C 中生成段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:33:51 24 4
gpt4 key购买 nike

在过去的 2 周里,我一直在努力让它发挥作用,但无济于事。我有一个项目来创建一个 shell 来实现解析和内置命令。我遇到的问题是当我将一个 char* 传递给我的解析函数并返回时,当我尝试访问它的任何部分时,我得到一个段错误。我尝试了不同的方法,包括一个包含 char** 的结构,但都遇到了同样的问题,所以我猜这是我的解析器的问题。我将不胜感激任何帮助。parser.c 的代码:

#define BUFSIZE 1024
#define TOK_BUFSIZE 64
#define TOK_DELIM " \t\r\n\a"

char*** Parse(char *line0){
char* null_ptr = 0;
char*** cmd = malloc(MAX_SIZE * sizeof(char**));
/*
char arg[] = argument
char* argv[] = argument array
char** cmd[] = array of argument arrays
*/
int bufsize = MAX_SIZE, cmdp = 0, argp = 0, com = FALSE, redir = FALSE;
char *token;
char* line = malloc(100*sizeof(char));
strcpy(line,line0);

token = strtok(line, TOK_DELIM);
while (token){
if (*token == ';'){ // new command string
char* tmp1 = malloc(BUFSIZE * sizeof(char));
char** tmpa = malloc(BUFSIZE * sizeof(char*));
strcpy(tmp1, token);
tmp1[sizeof(token)] = null_ptr;
tmpa[0]=tmp1;
cmd[cmdp] = tmpa;
argp = 0;
cmdp++;
com = FALSE;
redir = FALSE;
}
else if (*token == '>' || *token == '<' || token == ">>"){ // redirects
argp = 0;
char* tmp1 = malloc(BUFSIZE * sizeof(char));
char** tmpa = malloc(BUFSIZE * sizeof(char*));
strcpy(tmp1, token);
tmp1[sizeof(token)] = null_ptr;
tmpa[argp]=tmp1;
argp++;
printf("Redirect: %s\n",tmp1);
com = FALSE;
redir = TRUE;
}
else if (*token == '|'){ // pipe
printf("PIPE\n");
cmdp++;
argp = 0;
com = FALSE;
}
else if (redir){ // redirect file name
// redirect token stored in arg[]
char* tmp1 = malloc(BUFSIZE * sizeof(char));
char** tmpa = malloc(BUFSIZE * sizeof(char*));
strcpy(tmp1, token);
tmp1[sizeof(token)] = null_ptr;
tmpa[argp]=tmp1;
cmd[cmdp]=tmpa;
argp = 0;
cmdp++;
redir = FALSE;
com = FALSE;
printf("File: %s\n", token);
}
else if (token == "&") // background
{
cmdp++;
argp = 0;
char* tmp1 = malloc(BUFSIZE * sizeof(char));
char** tmpa = malloc(BUFSIZE * sizeof(char*));
strcpy(tmp1, token);
tmp1[sizeof(token)] = null_ptr;
tmpa[0]=tmp1;
cmd[cmdp]=tmpa;

printf("Background");
}
else if (!com && !redir){ // command entered
argp = 0;
char* tmp1 = malloc(BUFSIZE * sizeof(char));
char** tmpa = malloc(BUFSIZE * sizeof(char*));
strcpy(tmp1, token);
tmp1[sizeof(token)] = null_ptr;
tmpa[argp] = tmp1;

argp++;
printf("Command %s\n", token);
com = TRUE;
}
else if (com){ // argument to command, all other redirects and pipes taken care of
char* tmp1 = malloc(BUFSIZE * sizeof(char));
char** tmpa = malloc(BUFSIZE * sizeof(char*));
strcpy(tmp1, token);
tmp1[sizeof(token)] = null_ptr;
tmpa[argp] = tmp1;
argp++;
printf("Argument: %s\n", token);
//cmd[cmdp] = argv; // save current working argument array
//cmdp++;
}
// end of if else statements

token = strtok(NULL, TOK_DELIM);



} // end of while
cmdp++;
cmd[cmdp] = NULL;

return &cmd;
}

最佳答案

当我在命令行上输入以下内容编译您的代码时:

gcc /path/to/yourcodefilename.c -Wall -Wextra

但是将 /path/to/yourcodefilename.c 替换为包含最终调用您的函数的主要函数的代码的实际文件名(我的文件是 test2.c),我收到了警告。第一个是:

./test2.c:21: error: 'aaa' undeclared (first use in this function)
./test2.c:21: error: (Each undeclared identifier is reported only once
./test2.c:21: error: for each function it appears in.)

我收到了其中的一些。 “aaa”被替换为您在函数中使用的先前未定义的名称。这包括单词 TRUE 和 FALSE。要更正此问题,您可以在程序顶部使用:

#define FALSE n
#define TRUE y

其中 n 和 y 分别是代表 false 和 true 的数字。另一种更正它的方法是包含包含“TRUE”和“FALSE”定义的头文件。

我在几行中注意到的第二件事是:

warning: assignment makes integer from pointer without a cast

确保您没有将数据从一种类型转换为另一种类型。例如,不要将字符变量设置为指针值。

例如,改变:

  tmp1[sizeof(token)] = null_ptr;

到:

  tmp1[sizeof(token)] = '\0';

因为指定一个索引到一个char*意味着指定一个char,而null_ptr是char*char*类型char 不一样。我所做的是分配一个空值,它是一个 char

希望对你有帮助

关于c - 解析器在 C 中生成段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com