代码之家  ›  专栏  ›  技术社区  ›  Jos

重复数组元素

c++
  •  0
  • Jos  · 技术社区  · 6 年前

    我正在运行一个查找重复数组元素的代码。

    我使用2个函数进行此操作,但是当我运行代码时,尽管将其分配给1到99的随机数,我的应用程序仍会立即崩溃。

    这是代码。非常感谢。

    #include <ctime>
    #include <iostream>
    using namespace std;
    
    int UniqueArray(int arr[], int notunique);
    
    void printarray(int arr[]);
    
    int main() {
      int arr[20];
      int dup = 0;
      printarray(arr);
      for (int i = 0; i < 20; ++i) {
        UniqueArray(arr, dup);
      }
    }
    
    int UniqueArray(int arr[], int notunique) {
      notunique = 0;
    
      int i, j;
      int size = sizeof(arr) / sizeof(arr[0]);
      for (i = 0; i < size; i++) {
        for (j = i + 1; j < size; j++) {
          if (arr[i] == arr[j]) {
            notunique++;
            cout << "Array has duplicates: " << arr[i] << " ";
          }
        }
      }
      return notunique;
      cout << "There were  " << notunique << " Repeated elements";
    }
    
    void printarray(int arr[]) {
      int size = sizeof(arr) / sizeof(arr[0]);
      srand(time(0));
      arr[20] = rand () % +100;
      for (int i = 0; i < 20; ++i) {
        cout << arr[i] << " ";
      }
    }
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   cigien Jorge Eldis    6 年前

    这条线:

    arr[20] = rand () % +100; 
    

    不会用随机值填充大小为10的数组。它索引第20个位置,即UB。

    你可以用随机数填充数组,使用 std::generate ,就像这样:

    std::generate(arr, arr + 20, [] { return rand() % 100; });
    

    此外,在查找数组的大小时,您需要推断其大小:

    template <size_t N>
    void printarray(int (&arr)[N]) {
      // ... use N which is the size of arr
    

    或者更好的是,使用 std::array ,这是为你做的。

    一些小问题:

    不要使用 using namespace std; .

    在这段代码中:

    return notunique;
    cout << "There were  " << notunique << " Repeated elements";
    

    声明之后 return 永远不会被处决。

    在这一行:

    arr[20]=兰特()%+100;
    

    你不需要 + 操作员。