不太清楚为什么strtok没有按照我想要的方式工作

时间:2014-09-24 06:05:57

标签: c arrays malloc 2d strtok

编辑2:好的,我所做的就是将姓氏[i]指向的字符串的malloc更改为50个字节,我的程序运行正常。有谁能解释为什么?我认为这是因为strtok返回一个指向大于16字节的字符串的指针,并且我试图将该字符串分配给动态分配的16字节数组。谢谢。 我试图从文件中解析一行并将它们存储到3个并行数组中。我正在阅读的文本文件中包含以下内容:

瑞安,伊丽莎白O. \ n   麦金太尔,O。J. \ n   Cauble-Chantrenne,Kristin K. \ n   Larson,Lois F. \ n   索普,Trinity R. \ n   鲁伊斯,佩德罗M. \ n

每个人的格式是姓氏,名字/首字母和中间名字 我有3个并行数组:char ** surname,char ** first和char * middle_init 我已经检查过我对Fgets的调用。我的算法是先将每一行存储到surname [i]中,然后将其解析为其组件,然后解析为3个并行数组。

问题: 我的程序有效,但出于某种原因,它并不适用于#34; Cauble-Chantrenne,Kristin K。"当我打印出姓[2]和第一[2]时,我得到: Cauble-Chantren KristLarson

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("%s\n", surname[2]);
  printf("%s\n", first[2]);
  sort(num_people, surname, first, middle_init);
  write_names(num_people, argv[2], surname, first, middle_init);
  return 0;
}

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

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

我的所有其他功能都完美无缺,我的错误就是从文件中读取3个数组中的数据。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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