ошибка strtok и strcpy

Я использовал strtok для разделения строки.

[ОБНОВЛЕНИЕ] Я использовал ваши комментарии и ответы для новой версии ниже, но это не сработало.

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 в порядке.

У кого-нибудь есть идея?


person Roby    schedule 01.05.2011    source источник
comment
как узнать, что массив пуст? Я могу запустить его без каких-либо проблем. Массив split_url не пуст.   -  person Eric Z    schedule 01.05.2011
comment
Немного OT, но это явно C++, так зачем вообще использовать массивы?   -  person manneorama    schedule 01.05.2011
comment
Пожалуйста, не добавляйте обновления статуса, такие как [ОБНОВЛЕНИЕ] или [РЕШЕНО], в названиях ваших вопросов — все, что нужно, — это четкое изложение вопроса. Не волнуйтесь, все увидят, когда вы обновите свой вопрос.   -  person razlebe    schedule 11.05.2011


Ответы (3)


Поскольку вы не меняете, куда указывает указатель, вам нужно только передать char * вашей функции. Так

int Crawl :: splitUrl(char *tmp, int max_length, char *url)
person ColWhi    schedule 01.05.2011

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

Этот цикл for не может быть правильным. Вы копируете байты до тех пор, пока выполняется любое условие. Я считаю, что вы должны копировать только тогда, когда оба верны.

person Bo Persson    schedule 01.05.2011

Да, это правильно. Каждый параметр в 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);
person user411313    schedule 01.05.2011
comment
разыменование указателей, подобных этому, строго совместимо с ANSI C, работает всегда, но не для NULL, как в примере - person user411313; 01.05.2011