/*程序能运行正常,在结尾总会有个段错误,我怀疑是指针越界或内存没有释放*/
/*请高手指点,一定帮我修改,我郁闷两天了*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include"errno.h"
typedef enum Boolean{FALSE,TRUE}boolean;
typedef struct shell_command
{
char *full_cmd; /*取得的命令行命令*/
char *cmd; /*取得full_cmd中的命令*/
int args; /*full_cmd中命令的参数的个数*/
char **argv; /*取得full_cmd中的参数*/
char *cmd_path; /*取得命令要执行的文件*/
int is_input_redirect; /*是否有输入重定向*/
int is_output_redirect; /*是否有输出重定向*/
int is_pipeline; /*是否有管道*/
int is_backgroud; /*是否有后台运行*/
}*command;
int makeargv(const char*s, const char*delimiters,char ***argvp);
int split_command(command cmd);
int split_command(command cmd)
{
int i;
char delim[]=" ";
if((cmd->args=makeargv(cmd->cmd,delim,&cmd->argv))==-1)
{
printf("error for s%\n",cmd->argv[1]);
return 1;
}
for(i=0;iargs;i++)
printf("%d:%s\n",i,cmd->argv[i]);
return cmd->args;
}
int makeargv(const char*s, const char*delimiters,char ***argvp)
{
int i;
int numtokens;
const char * snew;
char *t;
if(s==NULL||delimiters==NULL||argvp==NULL)
{
return -1;
}*argvp=NULL;
snew=s+strspn(s,delimiters);
if((t=new char [strlen(snew)+1)]==NULL)
return -1;
strcpy(t,snew);
numtokens=0;
if(strtok(t,delimiters)!=NULL)
for(numtokens=1;strtok(NULL,delimiters)!=NULL;numtokens++)
if((* argvp=new char [numtokens+1])==NULL)
{
free(t);
return -1;
}
if(numtokens==0)
free(t);
else
{
strcpy(t,snew);
**argvp=strtok(t,delimiters);
for(i=1;i *(*(argvp)+i)=strtok(NULL,delimiters);
} *((*argvp)+numtokens)=NULL;
return numtokens;
}
main()
{
command cmd;
int num;
int i;
cmd->cmd="123 @#$ 456";
cmd->full_cmd="123 @#$ 456"/*目的是把字符串"123 @#$ 456"分割成每个单词,并用args统计单词个数*/
cmd->args=0; /*用二重指针argv指向每个单词*/
cmd->argv=NULL;
cmd->cmd_path=NULL;
cmd->is_input_redirect=0;
cmd->is_output_redirect=0;
cmd-> is_pipeline=0;
cmd->is_backgroud=0;
num=split_command( cmd );
printf("%d\n",num);
for(i=0;iargs;i++)
printf("%d:%s\n",i,cmd->argv[i]);
}
/*但是程序能运行正常,在结尾总会有个段错误,我怀疑是指针越界或内存没有释放*/
阅读(2420) | 评论(1) | 转发(0) |