Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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_Linux_Shell_Strtok - Fatal编程技术网

C 我的令牌函数出现意外行为

C 我的令牌函数出现意外行为,c,linux,shell,strtok,C,Linux,Shell,Strtok,我正在尝试用C编写一个简单的Shell。最终,我将实现进程和管道的分叉等。但是,现在,我只是想把所有的逻辑都弄清楚 我有一个部分工作的shell:当我键入exit时,它将退出。。。然而,我的令牌函数似乎不正常工作 我做错了什么?我不知道为什么它是分段断层 Token在while循环中打印一次,然后它会区分故障和崩溃 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义MAX_BUF_SZ 1024 void checkForPipe(字符*字符串,布尔*管道布尔); void chec

我正在尝试用C编写一个简单的Shell。最终,我将实现进程和管道的分叉等。但是,现在,我只是想把所有的逻辑都弄清楚

我有一个部分工作的shell:当我键入exit时,它将退出。。。然而,我的令牌函数似乎不正常工作

我做错了什么?我不知道为什么它是分段断层

Token
while
循环中打印一次,然后它会区分故障和崩溃

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAX_BUF_SZ 1024
void checkForPipe(字符*字符串,布尔*管道布尔);
void checkForRedirect(char*string,bool*redirect\u bool);
void tokenizeInput(字符*字符串、布尔管道、布尔重定向);
int main()
{
char*ptr;
布尔是_管道=0;
布尔值为0;
bool是_exit=0;
ptr=(char*)malloc(MAX_BUF_SZ);
而(!正在退出)
{
//显示提示
charcuru_dir[MAX_BUF_SZ];
getcwd(cur_dir,MAX_BUF_SZ);
printf(“外壳:%s$”,cur_dir);
fgets(ptr、MAX_BUF_SZ、stdin);
检查管道(ptr和is_管道);
checkForRedirect(ptr和is_redirect_out);
printf(“管道标志=%d\n”,是\u管道);
printf(“重定向标志=%d\n”,是\u redirect\u out);
if(strcmp(ptr,“exit\n”)==0)
{
is_exit=1;
}
标记输入(ptr、is_管道、is_重定向_输出);
}
返回0;
}
void checkForPipe(字符*字符串,布尔*管道)
{
char*检查管道的\u;
char*clean\u比较;
检查管道=(字符*)malloc(最大值);
clean_compare=(char*)malloc(MAX_BUF_SZ);
strcpy(检查管道、管柱);
strcpy(干净比较,字符串);
char*token=strtok(检查管道“|”);
if(strcmp(令牌,清除比较)==0)
{
免费的(干净的);
免费(检查管道);
}
其他的
{
*管道直径=1;
免费的(干净的);
免费(检查管道);
}
}
void checkForRedirect(字符*字符串,bool*重定向\u bool)
{
char*检查\u是否存在\u重定向;
char*clean\u比较;
检查重定向=(char*)malloc(MAX_BUF_SZ);
clean_compare=(char*)malloc(MAX_BUF_SZ);
strcpy(检查\u是否重定向,字符串);
strcpy(干净比较,字符串);
char*token=strtok(检查是否存在重定向“>”;
if(strcmp(令牌,清除比较)==0)
{
免费的(干净的);
免费(检查\u以获得\u重定向);
}
其他的
{
*重定向_bool=1;
免费的(干净的);
免费(检查\u以获得\u重定向);
}
}
void tokenizeInput(字符*字符串、布尔管道、布尔重定向)
{
字符*复制字符串;
复制字符串=(char*)malloc(MAX_BUF_SZ);
strcpy(复制字符串,字符串);
if(管道==0&&redirect==0)
{
字符**args={NULL};
char*token=strtok(复制字符串“”);
int i=0;
printf(“%s\n”,标记);
while(令牌!=NULL)
{
args[i]=令牌;
strtok(空,“”);
printf(“%s\n”,标记);
i++;
}
}
/*printf(“%s\n%s\n%s\n”,参数[0],参数[1],参数[2])*/
}

问题出在
args[i]
我修改了你的代码如下:

假设您有一个已知的令牌编号,它是
MAX\u BUF\u SZ
。 您可以分配类型为
char*

char**args=malloc(MAX_BUF_SZ*sizeof(char*);
在循环中,在使用每个指针之前,您仍然必须分配每个指针
char*

while(令牌!=NULL)
{
args[i]=(char*)malloc(strlen(token)+1);
printf(“%s\n”,标记);
args[i]=令牌;
令牌=strtok(空,“”);
i++;
}
整个功能如下:

void tokenizeInput(字符*字符串、bool管道、bool重定向)
{
字符*复制字符串;
复制字符串=(char*)malloc(MAX_BUF_SZ);
strcpy(复制字符串,字符串);
//假设我们有MAX_BUF_SZ代币
char**args=malloc(MAX_BUF_SZ*sizeof(char*);
if(管道==0&&redirect==0)
{
char*token=strtok(复制字符串“”);
int i=0;
//printf(“令牌%s\n”,令牌);
while(令牌!=NULL)
{
args[i]=(char*)malloc(strlen(token)+1);
printf(“%s\n”,标记);
args[i]=令牌;
令牌=strtok(空,“”);
i++;
}
}
/*printf(“%s\n%s\n%s\n”,参数[0],参数[1],参数[2])*/
}
下面是我运行的示例:

SHELL:D:\Users\T0180694\Documents\Mes Outils Personnels\PAN\PAN\u文件夹$test是您和我的邮件
管道标志=0
重定向标志=0
测试
是
埃塞
属于
你
和
我

使用调试器。至少你应该得到触发seg故障的确切代码行,并将其发布在你的问题中。您还可以使用调试器检查状态以查找可疑值和行为。
char**args={NULL}那是行不通的。它不是一个大小合适的数组。您需要一个至少足够大的数组来存储所有令牌。
char**args
是指向
char
的单个指针——它只是指向包含多个指针的内存块的一个指针或
NULL
(不是它们的数组)。与任何指针一样,必须确保它指向分配给指针的有效内存。(在这一点上,它是none——这意味着在这一点上它只是一个指向
NULL
的指针。)
args[i]
取消引用
NULL
指针,所以BAM!!塞格弗雷!这是一大堆指针——但至少它们是有效的指针
:)