2011-09-26 122 views
2

我一直無法讓這段代碼工作。我試圖讓一個字符數組被複制,這樣我就可以計算出有多少個令牌可以動態分配,並將它們保存到環境變量中進行檢查。但是,當我試圖壓縮原始字符串時,我會保留段落。strncpy分段錯誤

void echo(char *str1) 
    { 
     char *token, *temp; 
     char *saveptr1; 
     int j, i, k, counter; 
     char *copy; 

     strncpy(copy, str1, 80); 

     const char *delim = " "; 
     i = strlen(copy); 

     for(j = 0; j < i; j++, copy = NULL) 
     { 
     token = strtok_r(copy, delim, &saveptr1); 
     counter++; 
     if(token == NULL) 
     { 
      counter--; 
      break; 
     } 
     } 

     // initialize token array for echo 
     char *tokAr[counter]; 
     for(j = 0; j < counter; j++) 
     tokAr[j] = malloc(80*sizeof(char)); 

     for(j = 0, k = 0; j < i; j++, str1 = NULL) 
     { 
     tokAr[k] = strtok_r(str1, delim, &saveptr1); 
     if(tokAr[k] != NULL) 
     { 
      if(strchr(tokAr[k], 36) != NULL) 
      { 
       temp = enviro(tokAr[k]); 
       printf("%s ", temp); 
      } 
     else 
      printf("%s ", tokAr[k]); 
     } 
     else 
      break; 
     } 

     for(k = 0; k < counter; k++) 
     free(tokAr[k]); 
    } 

    char* enviro(char *ret) 
    { 
     char *copy, *expand, *saveptr; 
     const char *delim = "$"; 
     strcpy(copy, ret); 
     expand = strtok_r(copy, delim, &saveptr); 

     return getenv(expand); 
    } 

我知道它與我如何複製傳入的str1字符數組有關,但我無法從gdb中找出它。任何幫助將不勝感激

回答

9

您還沒有爲copy分配內存。

char *copy; 
strncpy(copy, str1, 80); 

嘗試mallocstrdup如果你不需要完整的81個字符。

copy = malloc(81); 
strncpy(copy, str1, 80); 

/* Or strdup. */ 
copy = strdup(str1); 
+0

讓我試試 – GFXGunblade

+0

謝謝。欣賞它 – GFXGunblade

+2

請注意,strncpy不_零終止目標字符串!你很少想使用這個功能。在這種情況下,strdup可能是你想要的。 另外請注意,您需要免費複製,因爲strdup爲它分配新的內存! – harald

2

copy不包含有效的分配地址。在使用copy之前,請分配足夠的內存與malloc。還請記住在完成使用它以停止較大程序中的內存泄漏後釋放copy

0

我認爲在函數echo中,你沒有初始化變量計數器並嘗試增加和減少它。 試着這樣做。