#include <stdio.h>
#include <unistd.h>
#include <regex.h>
#define MAX_LINE 80
int position = 0;
int main(void)
{
char *args[MAX_LINE/2+1];
char *tokens[MAX_LINE/2+1];
char *previoustokens[MAX_LINE/2+1];
char *history[10][MAX_LINE];
int should_run = 1;
char *split;
int i = 0;
while(should_run)
{
tokens[0]=NULL;
tokens[1]=NULL;
char* command, param;
int concurrent = 0;
printf("osh>");
fflush(stdout);
fgets(args, sizeof(args),stdin);
strtok(args,"\n");
split = strtok(args," ");
while(split!=NULL)
{
tokens[i]=strdup(split);
split = strtok(NULL, " ");
i++;
}
regex_t regex;
int reti;
char msgbuf[100];
/* Compile regular expression */
reti = regcomp(®ex, "^![[:digit:][:digit:]*]", 0);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
/* Execute regular expression */
reti = regexec(®ex, args, 0, NULL, 0);
if (!reti) {
puts(tokens[0]);
char *t = tokens[0];
t++;
int x;
for(x=0;x<MAX_LINE/2+1;x++)
{
tokens[x]=history[(int)t-1][x];
}
}
regfree(®ex);
}
}
所以这段代码应该做的是获取一个输入并将其拆分为令牌,然后检查是否与模式匹配,如果存在匹配模式,那么它应该从历史中复制一个条目并将其所有的所有物放入令牌,这是我得到分割错误的地方。
tokens[x] = history[(int)t-1][x];
我不确定为什么这不起作用。 非常感谢您的帮助。
由于
答案 0 :(得分:1)
编译后阅读你的警告,他们是有原因的。所以,t是一个char *,你试图将char *(我的系统上的8字节)转换为int(我系统上的4个字节),你觉得这会怎么样?分段错误是由该行引起的,因为(int)t-1可能是非常大的东西(t是char *并且它存储了一个地址),所以你试图访问未分配的内存
答案 1 :(得分:-1)
感谢Alexie Dariciuc,我解决了我的问题 令牌[X] =历史[的atoi(T)-1] [X];
PS:从现在开始,我发出警告xD