2014-02-13 51 views
4

是否有任何方法可以打印包含元素0的數組的長度,並且該數組已傳遞給只能有一個參數的函數數組?獲取傳遞給函數時包含元素0的數組的長度

實施例:

int arrLen(int arr[]) 
{ 
    //get size here; 
} 

int main() 
{ 
    int arr[]={0,1,2,3,4,5}; 
    arrLen(arr); 
} 

有在C++中的限制,我們不能數組的元素用NULL,如果它有一個零,但仍詢問是否有一種方法可以做到這一點比較。我只能將數組傳遞給函數是我的限制。

+2

最簡潔的方法是(按照優先順序)傳遞一個std :: vector 或添加另一個參數的大小。 –

回答

3

唯一的答案是,一旦將數組作爲參數傳遞,您將無法獲得數組的大小。你必須記住,當把一個數組作爲參數傳遞時,它會衰減到一個指針,編譯器不知道指針實際指向什麼。您還應該記住sizeof是編譯時操作,sizeof操作的結果由編譯器完成,而不是在運行時完成。

您必須放置一個特殊的數組末尾標記,就像字符串使用'\0'字符在數組末尾標記字符串的末尾一樣(請注意,此數組末尾標記可以是任何不應該在陣列中的東西,是零,-1或別的東西)。或者您必須將該長度作爲參數傳遞給該函數。

2

在通過數組數組作爲函數的參數的C中,您將指針傳遞給第一個元素。如果你想傳遞數組的大小,你應該把它作爲一個單獨的參數傳遞。

您可以存儲數組的長度在它的第一個元素:

int arr[] = {-1,0,1,2,3,4,5}; 
arr[0] = sizeof(arr)/sizeof(arr[0]) - 1; 

後你這樣做,你會在arr[0]得到數組的大小。

5

在你非常例如,你可以使用函數模板來得到你想要的東西:

template <size_t N> 
int arrLen(int (&arr)[N]) 
{ 
    return N; 
} 
+2

+1,但次要挑剔:它是一個函數模板,而不是模板函數。 (即它是創建函數的*模板*,它不是一種特殊的函數) – Angew

+1

我會說這不是_minor_ nitpick。 –

+0

我也會傳遞'const(&)[N]',並返回'constexpr'(如果使用C++ 11)。 – juanchopanza

2

有兩種方式來實現你想要什麼:

  • 知道數組的大小 - 你必須在函數中對其進行硬編碼,或者將其作爲參數傳遞。
  • 使用標記值。當你發現哨兵值時,你知道你已經達到了數據的末尾。例如,C字符串使用\0作爲標記。

後者似乎(例如使用INT_MIN爲定點)是適用於此處,但除非你有很好的理由,不這樣做。只需通過長度。

2

由於您控制計算數組長度的函數,因此可以決定某個特定的int值(或偶數序列),例如-1標記數組的末尾。然後,您可以像這樣實現您的arrLen功能(對其他功能進行了改進)。INT溢出):

int arrLen(int arr[]) 
{ 
    int size = 0; 
    int* p = arr; 
    while (*p != -1) { 
     ++size; 
     ++p; 
    } 
    return size; 
} 

然後,當然,你需要正確地「關閉」陣列上調用網站,或者你會碰到麻煩:

int arr[]={0,1,2,3,4,5, -1 }; 
0

感謝您的幫助,但這是我的限制,只傳遞1個參數到函數中,並且只能是一個數組。反正我只是寫了那個主要功能來理解,但實際上那個主要功能對我來說是不可用的。所以最後我得到一個函數,它可以得到一個可以是一個int數組並返回數組大小的參數。

我試着將我的int數組轉換爲這些int值的ascii數組,並且由於NULL或'\ 0'永遠不可能等於'0',因此將它們與NULL進行比較直到最後的數組是可能的。

但是,當我要轉換數組時,我又陷入了困境,我需要這個長度。

相關問題