指向C中的指针

时间:2015-05-13 12:44:37

标签: c pointers char

我正在编写一个下面的Pro * C程序,我收到了核心转储错误,有人可以帮我解决我做错了什么。我是C

的新手
int main(int argc,char *argv[])
{
  char inputpath1[300]="";
  char inputpath2[300]="";
  gets(inputpath1);
  gets(inputpath2);
  ExtractCmpFiles(inputpath1,inputpath2); //contains fullpath with file
return 0;
}

void ExtractCmpFiles(char *inputpath1,char *inputpath2)
{
  int i=0;
  char *strings[2];
  strings[0]=malloc(sizeof(inputpath1)+1);
  strcpy(strings[0],inputpath1);
  strings[1]=malloc(sizeof(inputpath2)+1);
  strcpy(strings[1],inputpath2);
  printf("Your files are:\n%s\n%s\n",strings[0],strings[1]);//i am getting output here
  char **holder='\0';
  char ioarea[4096];
  for(i=0;i<2;i++)
    {
      inFile=fopen(strings[i],"r");
      if(!inFile)
        {
          fprintf(stderr,": Open failure for output file:");
          fprintf(stderr,strings[i]);
          fprintf(stderr,"\n");
        }
      holder=&strings[i];
      holder=strrchr(strings[i],'/');  //checking the address of '/' to get only filename
      holder++; //incrementing pointer
      printf("your holder is: %s\n",*holder);
      if(strncmp(holder,"bills",5)==0) //checking value from the pointer address is "bills" or not
        {
          //do as you wish
        }
    }
}

输出:

/your/path/bills.cmp
/your/path/bill.cmp

谢谢大家。我已根据建议修改了该功能,但仍然遇到核心转储错误 添加修改后的功能:

 void ExtractCmpFiles(char *inputpath1,char *inputpath2)
{
  char *strings[2];
  strings[0]=(char*)malloc(strlen(*inputpath1)+1);
  strcpy(strings[0],inputpath1);
  strings[1]=(char*)malloc(strlen(*inputpath2)+1);
  strcpy(strings[1],inputpath2);

  printf("Your files are:\n%s\n%s\n",strings[0],strings[1]);

  char *holder=NULL;
  char ioarea[4096];

  int i=0;

  for(i=0;i<2;i++)
    {
      inFile=fopen(strings[i],"r");
      if(!inFile)
        {
          fprintf(stderr,": Open failure for output file:");
          fprintf(stderr,strings[i]);
          fprintf(stderr,"\n");
        }
      holder=strings[i];
      holder=strrchr(strings[i],'/'); 
      printf("i=%d --- %s\n",i,strings[i]);   //when i=0 it is giving output then it is giving coredump
      printf("your holder1 is: %s\n",holder);
      holder++;
      printf("your holder2 is: %s\n",holder);
      if(strncmp(holder,"custbills",9)==0)
        {
          //do something
        }
      else
        {
          //do something
        }

  fclose(inFile);
}

2 个答案:

答案 0 :(得分:4)

变量holder是指向char的指针,并为其分配strrchr的结果,该函数返回指向char的指针。

这将使holder不再指向数组条目,因此当您执行holder++时,它会完全指向其他位置,这会在您取消引用holder时导致未定义的行为。然后,您继续将holder传递给strncmp,这将再次为您提供未定义的行为。

holder变量也不是字符,因此不应将其初始化为一个字符。如果要初始化它,则应将其初始化为指向NULL

上面提到的事情应该让编译器向你发出警告。

另外,正如Cool Guy的评论中所述,如果你想获得字符串的长度,你应该使用strlen。当您使用sizeof时,您将获得指针的大小而不是它所指向的大小。

答案 1 :(得分:1)

strings[0]=(char*)malloc(strlen(inputpath1));
strings[1]=(char*)malloc(strlen(inputpath2));

...

char *holder=NULL;

...

fclose(inFile);