2014-02-13 35 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进行比较直到最后的数组是可能的。

但是,当我要转换数组时,我又陷入了困境,我需要这个长度。

相关问题