strtok()在C中给出分段错误

strtok()在C中给出分段错误,c,parsing,segmentation-fault,fread,strtok,C,Parsing,Segmentation Fault,Fread,Strtok,我试图解析一个由分号分隔的字符串。前3个令牌是int,最后一个令牌是字节数组。在我的代码中,一切都很正常,直到我得到要解析的第97个字符串,我得到了一个分段错误。我意识到在第97个字符串中,从我的文件中读取的字节是空的,尽管fread()返回1024个字节作为读取。然而,即使读取的字节看起来是空的,但当我将立即读取的所有字节写入文件时,该文件会很好。当最后一个标记为空时,如何修复对字符串的解析? 以下是我解析字符串的方式: void test(){ struct packetNode *ptr

我试图解析一个由分号分隔的字符串。前3个令牌是int,最后一个令牌是字节数组。在我的代码中,一切都很正常,直到我得到要解析的第97个字符串,我得到了一个分段错误。我意识到在第97个字符串中,从我的文件中读取的字节是空的,尽管fread()返回1024个字节作为读取。然而,即使读取的字节看起来是空的,但当我将立即读取的所有字节写入文件时,该文件会很好。当最后一个标记为空时,如何修复对字符串的解析? 以下是我解析字符串的方式:

void test(){
 struct packetNode *ptr = head;
 char *tokens;


 int s, c, size;
 int i = 0;
 char data[1024];

  while(ptr != NULL){
    memset(&data[0], 0, sizeof(data));
    tokens = strtok(ptr->packet,";");
    s = atoi(tokens);
    tokens = strtok(NULL, ";");
    c =  atoi(tokens);
    tokens = strtok(NULL, ";");
    size = atoi(tokens);
    tokens = strtok(NULL, ";");
    strcpy(data, tokens);

    printf("sequence: %d, checksum: %d, size: %d\n", s,c,size);

    ptr = ptr->next;
   i++;
  }


}
这就是我创建字符串的地方:

 //populate initial window of size 100
    FILE *fpNew = fopen("test.jpg", "w");

    for(i = 0; i < 100; i++){
      memset(&data[0], 0, sizeof(data));
      struct packetNode *p; // create packet node
      p = (struct packetNode *)malloc(sizeof(struct packetNode));
      bytes = fread(data, 1, sizeof(data), fp); // read 1024 bytes from file into data buffer
       int b = fwrite(data, 1, bytes, fpNew);

      printf("read: %d\n", bytes);
      memset(&p->packet[0], 0, sizeof(p->packet));
      sprintf(p->packet, "%d;%d;%d;%s", s, 0, numPackets, data); // create packet

      //calculate checksum
      int check = checksum8(p->packet, sizeof(p->packet));
      sprintf(p->packet, "%d;%d;%d;%s", s, check, numPackets, data); //put checksum in packet
      s++; //incremenet sequence number



      if(i == 0){
            head = p;
            tail = p;
            tail->next = NULL;
        }
        else{
            tail->next = p;
            tail = p;
            tail->next = NULL;
        }


    }
  fclose(fp);
//填充大小为100的初始窗口
文件*fpNew=fopen(“test.jpg”,“w”);
对于(i=0;i<100;i++){
memset(&data[0],0,sizeof(data));
struct packetNode*p;//创建数据包节点
p=(struct packetNode*)malloc(sizeof(struct packetNode));
bytes=fread(data,1,sizeof(data),fp);//将文件中的1024字节读入数据缓冲区
int b=fwrite(数据,1,字节,fpNew);
printf(“读取:%d\n”,字节);
memset(&p->packet[0],0,sizeof(p->packet));
sprintf(p->packet,“%d;%d;%d;%s”,s,0,numPackets,data);//创建数据包
//计算校验和
int check=checksum8(p->packet,sizeof(p->packet));
sprintf(p->packet,“%d;%d;%d;%s”,s,check,numPackets,data);//将校验和放入数据包中
s++;//递增序列号
如果(i==0){
水头=p;
尾=p;
tail->next=NULL;
}
否则{
尾部->下一步=p;
尾=p;
tail->next=NULL;
}
}
fclose(fp);

调用strcpy时,令牌指向数据中的一个位置


这是不允许的;您需要使用memmove或另一个函数调用。

既然您已经知道导致问题的文本行,请在程序中用硬编码的文本行发布一条消息。请始终检查strok的返回值,这样您就不会得到任何令人不快的惊喜。