2015-07-10 68 views
0

我是新的c程序員。我定義了一個函數,它解析一行並生成令牌。每個令牌都將保存在一個令牌數組中。所以我爲此創建了一個字符串數組。我定義的函數返回這個數組。現在我想返回的數組分配給新的陣列我得到一個錯誤:將返回的指針賦給一個新的數組

incompatible types when assigning to type ‘char *[5]’ from type ‘char **’. 

所以我沒有任何想法如何處理這個問題。這裏是整個代碼;

#include <string.h> 
#include <stdio.h> 

char ** parseLine(char * str){ 
    char del[2]=","; 
    char * token; 
    //Array of strings 
    char * tokenArr[5]; 
    token=strtok(str,del); 
    int i=0;  
    while(token!=NULL && i<5){ 
     //save each new token in the array of tokens 
     *(tokenArr+i)=*token; 
     token=strtok(NULL,del); 
     i++; 
    } 
    return tokenArr; 
} 

int main(int argc, char * argv []){ 
    char str[120]="Achon, Adkins, 3459345,cs,usa"; 
    char * tokenArray [5]; 
    tokenArray=parseLine(str); 
} 
+0

爲什麼返回指針的指針? 'char *'應該可以工作。 'char * parseLine(char * str)'應該解決這個問題。 –

+0

@amitakCs您應該在函數中動態分配一個數組,並且在main中也使用相同類型的指針。 –

+0

是的,@amitakCs指向正確。 'char * tokenArr = new char * [5];'動態創建數組。 –

回答

0

在C語言中,不可能從函數「返回」數組類型的值。無法「分配」或以任何其他方式使用核心語言功能複製陣列。

在你的情況下,通常的做法是將目標數組作爲參數傳遞給函數,並將其填充到函數中。你的函數的返回值可以用來標記的實際數量返回給用戶

unsigned parseLine(char * str, char *tokens[], unsigned max_tokens) 
{ 
    char del[2] = " ,"; 

    char *token = strtok(str, del); 
    unsigned i = 0;  

    while (token != NULL && i < max_tokens){ 
    tokens[i++] = token; 
    token = strtok(NULL, del); 
    } 

    return i; 
} 

你會打電話給你的功能

int main(int argc, char *argv[]) 
{ 
    char str[120] = "Achon, Adkins, 3459345,cs,usa"; 

    char *tokenArray[5]; 
    unsigned n_tokens = parseLine(str, tokenArray, 5); 

    for (unsigned i = 0; i < n_tokens; ++i) 
    printf("%s\n", tokenArray[i]); 
} 
+0

我更喜歡使用指針,所以我修改了一點while循環:*(token + i)= token; I + = 1; – amitakCs

+0

@amitakCs:兩種變體「使用指針」。 '']'運算符只是''''和'*'運算符上的語法糖。 – AnT

3

您試圖assing一個char到這裏字符指針:

*(tokenArr+i)=*token; 

token是一個指針,所以它分配,而不是價值它指向。

在函數中,您試圖返回一個本地數組tokenArr。返回一個數組和/或返回一個局部變量是不可能的。返回一個指針,指向在堆上,而不是分配的數組:

char** tokenArray; 
tokenArray=parseLine(str); 

char** parseLine(char* str){ 
... 
char** tokenArr = malloc(sizeof(*tokenArr)*5); 
... 
return tokenArr ; 
} 

當你解決這個問題,想想檢查你打電話,無效值函數的返回值。然後,你怎麼知道你實際上處理了多少元素,以及如何獲得這些信息。

+0

是的,我即將發表評論:即使這編譯的函數返回的字符串指針數組超出範圍,甚至銷燬,當函數退出。 –

+0

令牌指向一個字符串。所以爲什麼我使用解引用操作符來獲取字符串並將其分配給字符串數組 – amitakCs

+0

@amitakCs這會給你第一個字符。指針指向的字符串「is」。 – this