将文件字符串转换为char指针

时间:2015-01-19 09:59:19

标签: c file pointers struct

首先我要提供一些细节,我正在努力:

Ubuntu,用c语言编写,我的编译器是gcc。

我对我的技能进行了一次测试,因为我的指针并不是很好,所以我尝试了运气,得到了一个奇怪的输出。

我现在将展示我的代码。

  #include<stdio.h>
  #include<string.h>
  #define F1 ".file.txt"
  typedef struct{
   char par1[30];
   int par2;
   int par3;
   int par4;
   char* par5[3];
  }S1;
 //this was the structure I was working


  void initiate_S1(S1*a,char part1[],int* part2,int *part3, int*part4,char part51[],char part52[],char part53[]);
  //this function will start the struct parameters 
  void get_S1(S1*a);
  //this function will print struct parameters

  void save_S1_on_file(S1*a);
  //this will save all parameters of a structure in file

  void search_S1_on_file(S1*a);
  //This function will search for a first parameter of structure and if
 //find it fill the other parameters


  int main(){
   S1 a;
   int part2,part3,part4;
   char part1[30],part51[15],part52[15],part53[15];

   scanf("%s %d %d %d %s %s %s",part1,&part2,&part3,&part4,part51,part52,part53);

   initiate_S1(&a,part1,&part2,&part3,&part4,part51,part52,part53);

   get_S1(&a);

   save_S1_on_file(&a);

   search_S1_on_file(&a);

   get_S1(&a);

   return 0;
   }
   //this main is only to test the functions

   void initiate_S1(S1*a,char part1[],int* part2,int *part3, int*part4,char part51[],char part52[],char part53[]){

    strcpy(a->par1,part1);
    a->par2=*part2;
    a->par3=*part3;
    a->par4=*part4;
    a->par5[0]=part51;
    a->par5[1]=part52;
    a->par5[2]=part53;
   }

   void get_S1(S1*a){
    printf("%s\n%d\n%d\n%d\n%s %s %s\n",a->par1,a->par2,a->par3,a->par4,a->par5[0],a->par5[1],a->par5[2]);
   }

   void save_S1_on_file(S1*a){

     FILE *af;
     af=fopen(F1,"a");
     fprintf(af,"%s;%d;%d;%d;%s;%s;%s;\n",a->par1,a->par2,a->par3,a->par4,a->par5[0],a->par5[1],a->par5[2]);
     fclose(af);
   }

   void search_S1_on_file(S1*a){
    FILE *af;
    char s[100];
    char*token;
    af=fopen(F1,"r");
    int n=2;
    while(fgets(s,100,af)!=NULL){
     token=strtok(s,";");
     if(strstr(a->par1,token)!=NULL){
      n=0;
      token=strtok(NULL,";");
      a->par2=atoi(token);
      token=strtok(NULL,";");
      a->par3=atoi(token);
      token=strtok(NULL,";");
      a->par4=atoi(token);
      a->par5[0]=strtok(NULL,";");
      a->par5[1]=strtok(NULL,";");
      a->par5[2]=strtok(NULL,";");
      break;
     }
     else
      n=1;
    }
    if(n==1)
     printf("The S1 no exist\n");
   }

输入:

 name 15 3 2 tag1 tag2 tag3

输出:

    name
    15
    3  
    2
    tag1 tag2 tag3
    name
    15
    3
    2
    %��j��2 j��2 tag3

出于某种原因,当我尝试从文件字符串填充char指针时出现此weir输出 为什么我的代码中出现这种奇怪的字符和错误?

1 个答案:

答案 0 :(得分:1)

在你致电search_S1_on_file()

之前,你很好

在指针数组a->par5的内部,您可以指定局部变量s的地址。

  a->par5[0]=strtok(NULL,";");/* The string being broken into tokens is a local array */
  a->par5[1]=strtok(NULL,";");
  a->par5[2]=strtok(NULL,";");

一旦退出此函数,就会释放为数组s分配的内存,因此访问此内存位置必然会获得垃圾值,因为这是UB。

为了解决此问题,请在main中保留char array,并将其与其他需要参数一起传递给函数search_S1_on_file(),这应该有效。

或者,您可以尝试在堆上为数组s分配内存,如

char *s = malloc(100); /* Take care to free this memory accordingly */