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
的指针,并使用 new
为 idx
分配存储空间. (然后您将负责使用 delete[]
.
释放内存
如果您确实想为 arr
和 idx
使用分配的存储空间,您可以使用以下方法轻松实现:
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
以警告阴影变量)。对于 VS(cl.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 应用于
为什么我没有从该程序获得任何输出?
我尝试解决 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
的指针,并使用 new
为 idx
分配存储空间. (然后您将负责使用 delete[]
.
如果您确实想为 arr
和 idx
使用分配的存储空间,您可以使用以下方法轻松实现:
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
以警告阴影变量)。对于 VS(cl.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 应用于