2011-05-01 80 views
1

我用strtok來分割一個字符串。strtok和strcpy錯誤

[更新]我用了你的意見,回答下面的新版本,但沒有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都沒問題。

有人有想法嗎?

+0

你怎麼知道數組是空的?我可以運行它沒有任何問題。數組split_url不是空的。 – 2011-05-01 08:42:46

+0

有點OT,但這顯然是C++,所以爲什麼首先使用數組? – manneorama 2011-05-01 11:03:47

+0

請不要在問題標題中添加[UPDATE]或[已解決]等狀態更新 - 問題的明確摘要就是需要的。別擔心,當你更新你的問題時,每個人都可以看到。 – razlebe 2011-05-11 11:14:38

回答

-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); 
+0

像這樣取消引用指針就是要求麻煩。 – ColWhi 2011-05-01 10:38:55

+0

取消引用這樣的指針嚴格遵從ANSI C,始終如一,但不能像NULL – user411313 2011-05-01 11:27:21

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

這for循環可以是不正確的。只要條件爲真,您就複製字節。我相信只有在均爲的情況下才應該複製。

1

鑑於您沒有改變指針指向的位置,您只需將char *傳遞給函數即可。所以

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