C++程序没有给出输出

C++ program is not giving output

为什么我没有从该程序获得任何输出?

我尝试解决 YouTube 和堆栈中的所有问题,但没有成功。我尝试使用 vs 代码扩展,但如果它与 JSON 配置有任何关系,我不会。

这没有显示任何错误,但也没有显示任何输出。

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int main() {
  int n;
  cin >> n;
  int arr[n];

  for (int i = 0; i < n; i++) {
    cin >> arr[i];
  }

  const int N = 1e6 + 2;
  int idx[N];

  for (int i = 0; i < N; i++) {
    idx[i] = -1;
  }

  int minidx = INT_MAX;
  for (int i = 0; i < n; i++) {
    if (idx[arr[i]] != -1) {
      minidx = min(minidx, idx[arr[i]]);
    } else {
      idx[arr[i]] = i;
    }
  }

  if (minidx == INT_MAX) {
    cout << "-1" << endl;
  } else {
    cout << minidx + 1 << endl;
  }

  return 0;
}

帮我找到这个程序的输出。

我认为,如果您提示输入,则故障排除会更容易一些。我运行你的代码,一开始好像什么都没有输出,但那是因为需要先提供输入。

尝试将您的代码更改为:

#include<iostream>
#include<bits/stdc++.h>

using namespace std;

    int main()

{
    int n; 
    cout << "Input a number: ";
    cin >> n;
    int arr[n];

    for (int i = 0; i < n; i++)
    {
        cout << "Input a value: ";
        cin >> arr[i];
    }

    const int N = 1e6+2;
    int idx[N];

    for(int i = 0;i < N; i++)
    {
        idx[i] = -1;
    }

    int minidx = INT_MAX;
    for(int i =0; i < n; i++)
    {
        if (idx[arr[i]] != -1)
        {
            minidx = min(minidx, idx[arr[i]]);
        }
        else
        {
            idx[arr[i]] = i;
        }
    }

    if(minidx == INT_MAX)
    {
        cout << "The answer is " << "-1" << endl;
    }
    else
    {
        cout << "The answer is " << minidx + 1 << endl;
    }
    
    return 0;
    
}

您会注意到,根据您输入的第一个数字,您需要多次输入第二个数字。当我这样 运行 时,我输入第一个数字 5,然后输入 1、2、3、4、5。我得到“答案是 -1”的输出。

您没有输出,因为您的程序没有 运行。相反它crashes because of the too large array you're attempting to allocate on the stack. You would know it crashes if you were to debug它。

const int N = 1e6 + 2;
int idx[N];

修复它的一种方法是在堆上分配它:

int *idx = new int[N];
// ... continue as you were
delete[] idx;

记住必须释放堆内存的必要性是我建议您使用 vector

的原因
std::vector<int> idx(N);
// ... continue as you were

两种方法都解决了崩溃问题,并且您的程序 运行 符合预期。但是,请注意上述评论中关于非标准 VLA 和其他不良做法的建议。

包括bits/stdc++无效,见Why should I not #include <bits/stdc++.h>?。相反,仅包含您的代码所需的 headers,例如

#include <iostream>
#include <climits>      /* for INT_MAX */
#include <algorithm>    /* for std::fill */

如果您的输入中有一个无效字符 (non-digit),您很可能会触发自己的错误。除非检查输入后的 stream-state 并处理 .eof().fail().bad(),否则您无法正确使用任何输入功能。请参阅 std::basic_iostream(在 成员函数 下)

至少你需要类似于下面的东西,在输入错误时退出程序。 .eof().fail().bad()对应的错误请看std::basic_ios::rdstate,想更优雅的处理错误

    if (!std::cin >> n) {
        std::cerr << "error: invalid integer input 'n'.\n";
        return 1;
    }
    ...
    for (int i = 0; i < n; i++) {
        if (!std::cin >> arr[i]) {
            std::cerr << "error invalid integer input 'arr[i]'.\n";
            return 0;
        }
    }

您的 int arr[n]; 创建了一个 C VLA( 可变长度数组 )。 C++ 标准不提供 VLA,它们的使用仅由 non-standard 编译器扩展提供。

如评论和其他答案中所述,int idx[N]; 将尝试创建一个具有 自动存储持续时间 的 1,000,000 个整数数组,这将超过 [=] 上的堆栈大小94=] (1M) 并等于 Linux (4M) 上总堆栈大小的每一位。您要么需要使用 STL 库提供的容器,如 std::vector<int>,要么将 idx 声明为指向 int 的指针,并使用 newidx 分配存储空间. (然后您将负责使用 delete[].

释放内存

如果您确实想为 arridx 使用分配的存储空间,您可以使用以下方法轻松实现:

    int *arr = new int[n];    /* VLAs are not part of the C++ standard, 
                               * either allocate for arr, or use std::vector
                               */
    ...
    /* 1e6 will exceed stack stize on windows (1M) and
     * will equal the total stack size on Linux (4M),
     * as with arr, allocate for idx, or use std::vector
     */
    const int N = 1e6 + 2;
    int *idx = new int[N];

您稍后需要使用 delete[] 释放您分配的内存,如果没有在 main() 中分配(将在退出时释放)。

C++ 提供 std::fill 来处理作业,而不是循环填充 idx。这将填充 idx 减少到:

    std::fill (idx, idx + N, -1);   /* use std::fill to initialize */

可能还有其他问题我已经忽略了,您只需使用适当的编译器选项即可找到并解决这些问题。 (除了检查 n <= N

始终在启用警告的情况下编译,并且不要接受代码,直到它在没有警告的情况下编译.要启用警告,请将 -Wall -Wextra -pedantic 添加到您的 gcc/clang 编译字符串(也可以考虑添加 -Wshadow 以警告阴影变量)。对于 VScl.exe on windows),使用 /W3。所有其他编译器都有类似的选项。阅读并理解每个警告——然后去修复它。在启用完整警告的情况下,您在学习 C++ 时编写的所有代码都应该在没有单个警告的情况下编译。

如上所示分配的完整示例为:

#include <iostream>
#include <climits>      /* for INT_MAX */
#include <algorithm>    /* for std::fill */

int main()
{
    int n = 0; 
    
    if (!std::cin >> n) {
        std::cerr << "error: invalid integer input 'n'.\n";
        return 1;
    }
    
    int *arr = new int[n];    /* VLAs are not part of the C++ standard, 
                               * either allocate for arr, or use std::vector
                               */

    for (int i = 0; i < n; i++) {
        if (!std::cin >> arr[i]) {
            std::cerr << "error invalid integer input 'arr[i]'.\n";
            return 0;
        }
    }
    
    /* 1e6 will exceed stack stize on windows (1M) and
     * will equal the total stack size on Linux (4M),
     * as with arr, allocate for idx, or use std::vector
     */
    const int N = 1e6 + 2;
    int *idx = new int[N];
    
    std::fill (idx, idx + N, -1);   /* use std::fill to initialize */

    int minidx = INT_MAX;
    for (int i = 0; i < n; i++) {
        if (idx[arr[i]] != -1) {
            minidx = std::min (minidx, idx[arr[i]]);
        }
        else {
            idx[arr[i]] = i;
        }
    }

    if (minidx == INT_MAX) {
        std::cout << "-1\n";
    }
    else {
        std::cout << minidx + 1 << '\n';
    }
    
    delete[] arr;
    delete[] idx;
}

(注意: 你可以 #include <limits> 并使用 std::numeric_limits<int>::max() 而不是使用 C INT_MAX 宏)

检查一下,如果您还有其他问题,请告诉我。

解决方法很简单。

const int N = 1e6 + 2; // in place of this use
const int N = 1e5 + 2; //Use this
const int N=1e2; 

改变cont int N = 1e2的大小; 或者你可以将 1e2 或 1e3 应用于