2017-06-04 78 views
0

我完全不熟悉C語言,而且在C語言之前我曾使用過的語言是Java。我想獲得一個方法來返回一個字符數組,它不工作。下面是我的語法:爲什麼我得到「數組初始值設定項必須是初始化程序列表或字符串文字」?

char * insertToArray(char * val){ 
    int k; 
    char arr[2] = val; 
    // do some other staffs here to the value 
    return arr; 
} 

int main(){ 
    char s1[] = {"one", "two"}; 
    char newArr[]; 
    int i; 

    for(i = 0; i < 2; i++){ 
     newArr[] = insertToArray(s1[i]); 
    } 

    return 0; 
} 

所有我試圖做的是s1數組傳遞給insertToArray和做一些對值計算,然後返回一個全新的單一陣列。我是一個完整的初學者,我在網上找不到任何其他幫助。我究竟做錯了什麼?

+2

什麼是你期待與該行發生:'字符ARR [2] = VAL;'? –

+2

'char s1 []' - >'char * s1 []' – BLUEPIXY

+0

您得到它是因爲在C語言中,「數組初始值設定項必須是初始化程序列表或字符串文字」,就像編譯器告訴您的一樣。你的char arr [2] = val;違反了這個規則。 – AnT

回答

2

C的規則說你不能用指針初始化數組。相反,定義陣列然後複製到它:

char arr[strlen(val) + 1]; // Make sure there's enough space 
strcpy(arr, val); 

然後,你不能定義空數組。數組必須具有大小。並且使用main函數中的數組newArr無論如何都是錯誤的,因爲您調用的函數返回指針。所以newArr也必須是一個指針。


現在,在這種情況下,您的(當前)代碼中還有其他一些錯誤的東西。

第一個數組的大小爲arr。兩個字符的數組只能包含一個字符的字符串空間。請記住,字符串是空終止的,必須有足夠的字符串空間用於填充字符串加上終止符。

第二個問題是你返回一個指向局部變量的指針。一旦函數insertToArray返回,其所有局部變量就不復存在。當您使用它時,指向其中一個變量的指針將導致未定義的行爲

第一個問題的解決方法如上所示。對第二個問題的修復有點難度,並且涉及向函數傳遞額外參數或動態分配內存。我建議額外的參數的方法:

char * insertToArray(const char * val, char * arr){ 
    strcpy(val, arr); 

    // do some other staffs here to the value 

    return arr; 
} 

然後調用它像

char newArr[strlen(s1[i]) + 1]; 
insertToArray(s1[i], newArr); 
相關問題