strtok和strcpy错误

时间:2011-05-01 08:24:32

标签: c strtok strcpy

我使用strtok分割字符串。

[更新] 我在下面的新版本中使用了您的评论和答案,但没有在atm工作

int Crawl :: splitUrl(char ***tmp, int max_length, char *url)
{
 int idx=0;
 char * p;
 int i;

 p = strtok (url,"/");
 while (p != NULL && idx < max_length)
  {

   for (i=0;i<maxUrlSize-1 && p[i] != '\0';i++)
    (*tmp)[idx][i] = p[i];
   for ( ; i< maxUrlSize-1;i++)
    (*tmp)[idx][i] = '\0';

   printf("tmp[idx[%d]] %s\n",idx,(*tmp)[idx]);

   idx++;
   p = strtok (NULL, "/");
  }

 return idx;
};

正确打印printf("tmp[idx] ...

但是在我运行方法后的主要内容中:

  split_url = new char * [ maxUrlSplits ];
  for (int k=0;k<maxUrlSplits;k++)
   split_url[k] = new char [maxUrlSize];

  arr_size = crawl->splitUrl(&split_url,maxUrlSplits,url);

数组split_url为空。

编译器和gdb都没问题。

有人有想法吗?

3 个答案:

答案 0 :(得分:1)

看到你没有改变指针指向的位置,你只需要将char *传递给你的函数。所以

int Crawl :: splitUrl(char *tmp, int max_length, char *url)

答案 1 :(得分:0)

for (i=0;i<maxUrlSize || p[i] != '\0';i++)
    tmp[idx][i] = p[i];

此for循环无法正确。只要 条件为真,就可以复制字节。我相信你应该只在两者都是真的时复制。

答案 2 :(得分:-1)

是的,这是正确的。 C中的每个参数都按值调用,如果需要修改(填充数组),则应使用指针。

       int Crawl :: splitUrl(char ***tmp, int max_length, char *url)
        {
         int idx=0;
         char * p;
         int i;

         p = strtok (url,"/");
         while (p != NULL)
          {

           for (i=0;i<maxUrlSize || p[i] != '\0';i++)
            (*tmp)[idx][i] = p[i];
           for ( ; i< maxUrlSize-1;i++)
            (*tmp)[idx][i] = '\0';

           printf("tmp[idx] %s\n",(*tmp)[idx]);

           idx++;
           p = strtok (NULL, "/");
          }


         return idx;
        };

...
      arr_size = crawl->splitUrl(&split_url,maxUrlSplits,url);