令牌存储不当?文件解析问题

时间:2016-03-18 02:36:59

标签: c arrays string pointers token

我正在处理一个项目,我需要从文件中对某些数据进行排序。该文件是由"标签空间"分隔的长字符串列表(我认为该文件是分隔的,但我不确定)。以下是该文件的一行示例:

2986043 Pic de Font Blanca Pic de Font Blanca Pic de Font Blanca,Pic du Port 42.64991 1.53335 T PK AD

中间的两个双打(例如:42.64991和1.5335)是我所关注的,因为我将要存储它们并在以后使用它们进行排序。这只是使用前1000行输入数组的原型,但文件的实际大小是数百万行。实际的数据结构将是某种链接列表(我认为?不确定哪种工作最适合这种工作)

这里有一组循环,我从文件指针中对字符串进行标记,并尝试将字符串复制到我设置的指针数组中:

  int curr_line=0;
  int longlat;
  char* coord[1000][2];

  /* clock starts to time process
   * this pair of loops works through each line of the file, token by token
   *
   */
  start = clock();
   while(fgets(duff, 512, (FILE*)fp) !=NULL)
   {
      int coordFlag=0;
      //char* token=strtok(duff, " ");
      char* token=strtok(duff, " \t");
      while(token)
      {
        if(verify(token))
        {
            //printf("tok: %s\n", token);
            coordFlag++;
            if(coordFlag==1)
            {
                printf("%s||", token);
                strcpy(coord[curr_line][0], token);

            }
            if(coordFlag==2)
            {
                printf("%s\n", token);
                strcpy(coord[curr_line][1], token);

            }
        }
        //printf("tok: %s\n", token);

        token=strtok(NULL, " \t");


      }
      curr_line++;
      if(curr_line==1000) break;

   }

目前,我遇到一个运行时错误,程序在尝试存储第一个字符串时崩溃。我相信我错误地使用了数组,和/或字符串和令牌的字符串指针。

我的主要目标是解析由空格和分隔制表符分隔的字符串行,并抓住中间的两个字符串,即经度和纬度,并将它们存储在数组中。

作为后续问题,这个存储怎么能以双打的方式完成。在中,我可以解析令牌,然后创建一个空白的双变量,制作解析后的令牌的副本并将其存储为带有类型转换的双精度或更高效的策略吗?

1 个答案:

答案 0 :(得分:1)

您正在使用未初始化且无意义的指针来存储令牌,这非常糟糕。

在复制字符串之前,分配用于存储令牌的缓冲区。

if(coordFlag==1)
{
    printf("%s||", token);
    coord[curr_line][0] = malloc(strlen(token) + 1); // add this line
    strcpy(coord[curr_line][0], token);

}
if(coordFlag==2)
{
    printf("%s\n", token);
    coord[curr_line][1] = malloc(strlen(token) + 1); // add this line
    strcpy(coord[curr_line][1], token);

}

注意:

  • 不要忘记+1终止空字符。
  • 添加一些代码以检查malloc()是否成功并处理错误将使此代码更好。