2011-09-26 120 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中,你没有初始化变量计数器并尝试增加和减少它。 试着这样做。