ошибка strtok и strcpy - PullRequest
       39

ошибка strtok и strcpy

1 голос
/ 01 мая 2011

Я использовал 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 ]

1 голос
/ 01 мая 2011

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

int Crawl :: splitUrl(char *tmp, int max_length, char *url)
0 голосов
/ 01 мая 2011
for (i=0;i<maxUrlSize || p[i] != '\0';i++)
    tmp[idx][i] = p[i];

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

0 голосов
/ 01 мая 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);
...