【问题标题】:strtok and strcpy errorstrtok 和 strcpy 错误
【发布时间】:2011-08-16 09:11:53
【问题描述】:

我使用strtok 来拆分字符串。

[UPDATE]我使用了你的 cmets 并回答了下面的新版本,但是 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都可以。

有人有想法吗?

【问题讨论】:

  • 你怎么知道数组是空的?我可以毫无问题地运行它。数组 split_url 不为空。
  • 有点OT,但这显然是C++,那么为什么首先使用数组呢?
  • 请不要在您的问题标题中添加 [UPDATE] 或 [SOLVED] 之类的状态更新 - 只需对问题进行清晰的总结即可。不用担心,当您更新问题时,每个人都可以看到。

标签: c strtok strcpy


【解决方案1】:

由于您没有更改指针指向的位置,因此您只需将 char * 传递给您的函数。所以

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

【讨论】:

    【解决方案2】:
    for (i=0;i<maxUrlSize || p[i] != '\0';i++)
        tmp[idx][i] = p[i];
    

    这个 for 循环不可能是正确的。只要 either 条件为真,您就可以复制字节。我相信只有当两者都为真时,你才应该复制。

    【讨论】:

      【解决方案3】:

      是的,这是正确的。 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);
      

      【讨论】:

      • 像这样的解引用指针严格符合 ANSI C,一直有效,但不适用于示例中的 NULL
      猜你喜欢
      • 2013-04-23
      • 2016-07-21
      • 2021-02-28
      • 2014-12-21
      • 1970-01-01
      • 2018-02-07
      • 2013-02-13
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多