2013-03-11 61 views
0

任何人都可以啓發我爲什麼此代碼不工作?通過引用返回的C式字符串

  • 我通過char *指向我的分割函數並分割我的緩衝區。
  • 在堆上爲每個傳入的arg(char *)分配內存,然後在此新緩衝區中執行strcpy子串。
  • 它一切正常,直到我從方法返回並嘗試打印任何變量。
  • 分割失敗
void split(char * buffer, int num, ...) 
{ 
    char* string; 
    char* tofree; 
    string = strdup(trim(buffer)); 

    if (string != NULL) { 
    tofree = string; 

    va_list arguments; 

    //Initializing arguments to store all values after num 
    va_start (arguments, num);   

    int i = 0; 
    for (i = 0; i < num; i++)   
    { 
     //Item is the final store place of the split substring 
     char * arg = va_arg (arguments, char *); 

     //Split the strings, delimiter is space 
     char * splitBuffer = strsep(&string, " "); 

     //Allocate the buffer memory to store the splitBuffer 
     arg = malloc(sizeof(char*)*strlen(splitBuffer)); 

     strcpy(arg ,splitBuffer); 
     printf("Buffer [%s] -- [%s]n", buffer, arg); 
    } 
    va_end (arguments); // Cleans up the list 


    free(tofree); 
    } 
} 




     char * a; 
     char * b; 
     char * c; 
     split(buffer,3,a,b,c); 
     printf("Print A = %s B = %s C = %s\n", a,b,c); 
+1

你可能需要在發送指向a,b和c的指針,然後在循環中進行賦值時使用deref。目前,它正在改變你的本地指針(副本),而不是實際的指針。 – tjameson 2013-03-11 15:29:08

+0

請重新縮進代碼,將製表符轉換爲空格......每當將代碼粘貼到SO時,請確保它不包含製表符,因爲這些製作混亂。 – hyde 2013-03-11 15:30:53

+0

但(a,b,c)都是char *,所以它們已經是指針了?雖然你的權利,它做一些複製一些地方,因此外部的功能從未改變。 – 2013-03-11 15:32:56

回答

2

@tjameson意味着這個,我覺得:

void split(char * buffer, int num, ...) 
    { 
    char* string; 
    char* tofree; 
    string = strdup(trim(buffer)); 

    if (string != NULL) 
    { 
     tofree = string; 

     va_list arguments; 

     //Initializing arguments to store all values after num 
     va_start (arguments, num);   

     int i = 0; 
     for (i = 0; i < num; i++)   
     { 
      //Item is the final store place of the split substring 
      char ** arg = va_arg (arguments, char **); 

      //Split the strings, delimiter is space 
      char * splitBuffer = strsep(&string, " "); 

      //Allocate the buffer memory to store the splitBuffer 
      *arg = malloc(sizeof(char*)*strlen(splitBuffer)); 

      strcpy(*arg ,splitBuffer); 
      printf("Buffer [%s] -- [%s]\n", buffer, *arg); 
     } 
     va_end (arguments); // Cleans up the list 

     free(tofree); 
    } 
    } 


    char * a; 
    char * b; 
    char * c; 
    split(buffer,3,&a,&b,&c); 
    printf("Print A = %s B = %s C = %s\n", a,b,c); 

它應該工作的罰款。

+0

是的。我正在研究一個工作解決方案,但是當前的示例正在運行時遇到問題。從我+1。除了va_arg需要一個char **。 – tjameson 2013-03-11 15:38:21

+0

是的,非常感謝! – 2013-03-11 15:39:34

1

在C中,指針通過值傳遞。如果你傳遞一個指向函數的指針,然後改變它的值 - 它指向的對象的地址 - 在該函數中,它不會像C++引用那樣傳播到原始指針。

這裏,malloc將改變地址指向arg(即abc),但只能在本地。實際的a,bc(例如,main)將保持未初始化。 你的編譯器可能會提醒你。

使用雙間接傳遞的指針時:

split(buffer,3, &a, &b, &c); 

...和正確的代碼在你的split功能,如:

char **arg = va_arg (arguments, char **); 
*arg = malloc(...); 
// etc.