我正在尝试解析输入以将其分成命令和参数, 我能够分裂,但当我尝试分配到包含许多字符串的数组时,问题正在发生。 例如:
cmd1<infile |cmd2 -a -b -c|cmd3 -x -y -z>outfile
带参数的命令,拆分是好的但最后当我打印我的数组时它没有显示正确的输出,我无法理解c中char *的工作。
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
char* Getfile(char *input,int flag)
{
int i,k;
char *file;
//printf("\n++++++++++++++++++++++++++");
//puts(input);
if(strcmp("exit",input)==0)
exit(0);
for(i=0;input[i]!='\0';i++)
{
if(flag==0 && input[i]=='<')
break;
else if(flag==1 && input[i]=='>' )
{
if(input[i-1]!='2')
break;
else if(input[i-1]=='2' && input[i-2]!=' ' )
break;
}
else if(flag==2 && input[i]=='>' && input[i-1]=='2' && input[i-2]==' ' )
break;
}//for
if(input[i]==NULL)
return NULL;
i++;
//cmd f1 2>f2
for(k=0;input[i]!='>' && input[i]!='<'&& input[i]!=NULL ;i++,k++)//dont include ' ' cond otherwise cmd< f1 will not work
{
if(input[i]==' ' && input[i+1]=='2' && input[i+2]=='>')
break;
file[k]=input[i];
// printf("\n %d %c",i,input[i]); // getch();
}
file[k]=NULL;
// printf("\n return file%d is \n",flag);
// puts(file);
//getch();
return file;
}//function
//--------------------------------------------------------
char *Getcommand(char *input)
{
char *cmd;
int i,k;
for(k=0,i=0;input[i]!='>' && input[i]!='<'&& input[i]!=NULL;i++,k++)
{
cmd[k]=input[i];
//printf(" %c",cmd[k]);
}//for
if(input[i]=='>' && input[i-1]=='2' &&input[i-2]==' ' )
cmd[k-2]=NULL;
cmd[k]=NULL;
//printf("\ncommand is");
// puts(cmd);
// getch();;
return cmd;
}
//-------------------------------------------------------
void main()
{
/*
char *args[10][20]={
{"ls","-a","-i",(char*)NULL},
{"sort",(char*)NULL},
{"wc","-c",(char*)NULL}
}; */
char *args[10][20],*input,*commands[10],*temp[10];
int i=0,k=0,noc=-1;
char *inputcopy,*inputcopy2,*inputfile,*outputfile,*errorfile[10];
clrscr();
//------------
printf("enter string\n");
gets(input);
strcpy(inputcopy,input);
commands[0]=strtok(inputcopy,"|");
for(i=0;commands[i]!=NULL;)
{ commands[++i]=strtok(NULL,"|");
}
noc=i-1; //no of commands brgin from 0
strcpy(inputfile,Getfile(commands[0],0));
strcpy(outputfile,Getfile(commands[noc],1));
i=0;
while(i<=noc)
{
strcpy(inputcopy,Getcommand(commands[i]));
k=0;
//----
args[i][k]=strtok(inputcopy," ");
while(args[i][k]!=NULL)
args[i][++k]=strtok(NULL," ");
//------- immediate printing show args[i][k] has correct value :/ -----------
for(k=0;args[i][k]!=NULL;k++)
printf("\n --args[%d][%d]= %s ",i,k,args[i][k]);
// getch();
//-----
i++;
}
//---------
printf("\n outputfile=%s",outputfile);
printf("\n inputfile=%s",inputfile);
//===========but here actual printing is not showing correct output=====
i=0;
while(i<=noc)
{
printf("\n**********comands no %d *******",i);
for(k=0;args[i][k]!=NULL;k++)
printf("\n args[%d][%d] %s ",i,k,args[i][k]);
getch();
i++;
}
//------
getch();
}//main
答案 0 :(得分:1)
您声明了char * File,但没有为它分配任何空间。您正在尝试将内容复制到一个数组中,该数组仅指向内存中的某个空间然后展开它,我相信未定义的行为。使用malloc / calloc为它创建空间。
file = (char * ) malloc(sizeof(char) * maxLength);
您定义数组的maxLength,然后在for循环中复制。
中的内容 for(k=0;input[i]!='>' && input[i]!='<'&& input[i]!=NULL && k < maxLength ;i++,k++)//dont include ' ' cond otherwise cmd< f1 will not work
{
if(input[i]==' ' && input[i+1]=='2' && input[i+2]=='>')
break;
file[k]=input[i];
// printf("\n %d %c",i,input[i]); // getch();
}