c-不太确定为什么strtok没有按照我希望的方式工作



EDIT 2:好吧,我所做的只是将姓氏[i]指向的字符的malloc更改为50字节,我的程序运行良好。有人能解释一下原因吗?我认为这是因为strtok返回了一个指向大于16字节的字符串的指针,我正试图将该字符串分配给一个动态分配的16字节数组。谢谢我试图解析一个文件中的一行,并将它们存储到3个并行数组中。我正在阅读的文本文件中有这样的内容:

Ryan,Elizabeth O麦金太尔捕获Chantrenne,Kristin KLois F.LarsonThorpe,Trinity RRuiz,Pedro M.

每个人的格式为姓氏、名字/首字母和中间首字母我有3个并行数组:char**姓氏、char**第一和char*midd_init我已经检查过我打给Fgets的电话是否正常。我的算法是首先将每一行存储到姓氏[i]中,并将其解析为其组件,然后解析为3个并行数组。

问题:我的程序有效,但由于某种原因,它不适用于"Cauble Chantrenne,Kristin K."。当我打印出姓氏[2]和第一个[2]时,我得到:捕获的ChantrenKristLarson

int main(int argc, char *argv[]) {
  char **surname, **first;
  char *middle_init;
  int num_people;
  FILE *fp = fopen(argv[1], "r");
  fscanf(fp, "%d", &num_people);
  surname = (char**)malloc(sizeof(char*) * num_people);
  first = (char**)malloc(sizeof(char*) * num_people);
  middle_init = (char*)malloc(sizeof(char) * num_people);
  read_names(fp, num_people, surname, first, middle_init);
  fclose(fp);
  printf("%sn", surname[2]);
  printf("%sn", first[2]);
  sort(num_people, surname, first, middle_init);
  write_names(num_people, argv[2], surname, first, middle_init);
  return 0;
}

有人能告诉我我的问题是什么吗?谢谢!!!我确信我的问题与我的代码的这一部分有关。附言:据我所知,strtok返回一个指向令牌的指针,并自动放置一个"\0",对吗?为什么first[2]不是Kristin?它显然由两个分隔符分隔,即"<-空的空间。非常感谢!!真的很感激这段时间。

 while(fgets(surname[i], 80, fp) != NULL) {
    surname[i] = strtok(surname[i], ",");
    if (strlen(surname[i]) >= 16) {
      surname[i][15] = '';
    }
    first[i] = strtok(NULL, ". ");
    if (strlen(first[i]) >= 16) {
      first[i][15] = '';
    }
    middle_init[i] = *(strtok(NULL, ". "));
    i++;
  }

我的所有其他函数都能很好地工作,我的错误只是在将文件中的数据读取到3个数组中。谢谢

您需要将一个临时缓冲区传递到fgets中,因为strtok会截断原始字符串。因此,通过使用一个单独的字符串来保存读取行,可以防止意外结果截断源字符串。

此外,您的if语句似乎很奇怪。您正在剪切16字节的字符串,这可能是您想要做的,但在这个代码块中这样做似乎很奇怪。

相关内容

  • 没有找到相关文章

最新更新