2014-09-28 95 views
1

所以我试图找出一种方法来迭代,虽然数组传递到一个函数而不知道大小。我用我的代码遇到无限循环,因为数组不是NULL终止。由于数组通过函数变成了指针,我不能使用sizeof(Array)/ sizeof(int)来获取元素的数量。有没有什么办法没有NULL终止我的数组?通过函数遍历c数组

我的查找功能:

int find(const int* arr, int val) 
{ 
    int pos = 0; 
    while (arr != NULL) 
    { 
     if (*arr == val) 
     { 
      return pos; 
     } 
     pos++; 
    } 
    return -1; 
}; 

我的主:

int IntArr[] = { 1, 2, 3, 4, 5 }; 
int index = find(IntArr, 4); 
cout << "find(IntArr, 4)" << endl; 
cout << "index: " << index << endl << endl; 
+1

如果你不知道大小,你是SOL。如果你猜测,你会猜错。你说没有终结者?好的,那么你必须通过其他方式来传递长度,就像在另外一个参数中一样。 – Deduplicator 2014-09-28 18:33:48

+1

传递数组的大小,或使用'std :: array'或'std :: vector'并通过引用传递,因为他们知道它们的大小(或者传递它们的开始和结束迭代器) – 2014-09-28 18:35:40

+0

PS有'std :: find'函数 – 2014-09-28 18:39:43

回答

1

例如,你可以定义引用接受一个数组的模板功能

template <size_t N> 

int find(const int (& arr)[N], int value) 
{ 
    int pos = 0; 

    while (pos < N && arr[pos] != value) ++pos; 

    return pos == N ? -1 : pos; 
} 

要考虑到在标头<algorithm>中声明了标准算法std::find。你可以写例如

#include <algorithm> 
#include <iterator> 

//.. 

int IntArr[] = { 1, 2, 3, 4, 5 }; 
auto ptr = std::find(std::begin(IntArr), std::end(IntArr), 4); 
cout << "find(std::begin(IntArr), std::end(IntArr), 4)" << endl; 
cout << "index: " << std::distance(std::begin(IntArr), ptr) << endl << endl; 
+0

或者只是使用'std :: find'并传递两个迭代器。 – rightfold 2014-09-28 19:04:50