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

时间:2013-10-23 20:52:29

标签: c string char strtok

我正在尝试解析输入以将其分成命令和参数, 我能够分裂,但当我尝试分配到包含许多字符串的数组时,问题正在发生。 例如:

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

1 个答案:

答案 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();
   }