C 打印字符指针数组中的元素时的不确定行为?

C 打印字符指针数组中的元素时的不确定行为?,c,string,char,strtok,C,String,Char,Strtok,我试图解析输入,将其分解为命令和参数, 我可以拆分,但当我尝试分配到包含多个字符串的数组中时,问题就出现了。 例如: cmd1outfile 对于带参数的命令,拆分是可以的,但最后当我打印数组时,它没有显示正确的输出,我无法理解c中char*的工作原理 #include<stdio.h> #include<conio.h> #include<malloc.h> char* Getfile(char *input,int flag) { int i,k; c

我试图解析输入,将其分解为命令和参数, 我可以拆分,但当我尝试分配到包含多个字符串的数组中时,问题就出现了。 例如:

cmd1outfile
对于带参数的命令,拆分是可以的,但最后当我打印数组时,它没有显示正确的输出,我无法理解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
#包括
#包括
#包括
char*Getfile(char*input,int标志)
{
int i,k;
字符*文件;
//printf(“\n+;
//输入;
如果(strcmp(“退出”,输入)=0)
出口(0);
对于(i=0;输入[i]!='\0';i++)
{
如果(标志==0&&input[i]='')
{
如果(输入[i-1]!='2')
打破
else if(输入[i-1]='2'&输入[i-2]!='')
打破
}
else if(标志==2&&input[i]='>'&&input[i-1]==2'&&input[i-2]=='')
打破
}//为了
if(输入[i]==NULL)
返回NULL;
i++;
//cmd f1 2>f2
对于(k=0;输入[i]!='>'&&input[i]!='>)
打破
文件[k]=输入[i];
//printf(“\n%d%c”,i,输入[i]);//getch();
}
文件[k]=NULL;
//printf(“\n返回文件%d为\n”,标志);
//放置(文件);
//getch();
返回文件;
}//作用
//--------------------------------------------------------
char*Getcommand(char*input)
{
char*cmd;
int i,k;
对于(k=0,i=0;输入[i]!='>'和输入[i]!=''&&input[i-1]='2'&&input[i-2]='')
cmd[k-2]=NULL;
cmd[k]=NULL;
//printf(“\n命令为”);
//put(cmd);
//getch();;
返回cmd;
}
//-------------------------------------------------------
void main()
{
/*
字符*args[10][20]={
{“ls”、“-a”、“-i”、(char*)NULL},
{“sort”,(char*)NULL},
{“wc”、“-c”、(char*)NULL}
}; */
字符*args[10][20],*输入,*命令[10],*临时[10];
int i=0,k=0,noc=-1;
char*inputcopy、*inputcopy2、*inputfile、*outputfile、*errorfile[10];
clrsc();
//------------
printf(“输入字符串\n”);
获取(输入);
strcpy(输入拷贝,输入);
命令[0]=strtok(inputcopy,“|”);
对于(i=0;命令[i]!=NULL;)
{commands[++i]=strtok(NULL,“|”);
}
noc=i-1;//来自0的命令数brgin
strcpy(inputfile,Getfile(命令[0],0));
strcpy(outputfile,Getfile(命令[noc],1));
i=0;

虽然(i您声明了char*文件,但没有为其分配任何空间。您试图将内容复制到一个数组中,该数组只指向内存中的某个空间,然后对其进行扩展,我认为这是一种未定义的行为。请使用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();
   }
for(k=0;输入[i]!='>'&&input[i]!='>)
打破
文件[k]=输入[i];
//printf(“\n%d%c”,i,输入[i]);//getch();
}

请通过管道将代码缩进
中,在适当的地方添加空行,并删除有害的注释,如
//for
-它们除了可读性之外没有其他用途。我不明白你的意思。@userXXX我的意思是:“格式化代码,因为它是一个不可读的乱七八糟的东西。”如何为char*args[10][20]分配空间如果可以在编译时确定大小,那么只需使用char数组..char myvar[][],否则需要指向指针的指针。其中分配的空间是数组的数量,每个数组也需要分配空间。
   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();
   }