如何解决C++ 程序没有给出输出
为什么我没有从这个程序中得到任何输出?
我尝试解决 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;
}
帮我找到这个程序的输出。
解决方法
你没有输出,因为你的程序没有运行。相反,它 crashes 因为您试图在堆栈上分配太大的数组。如果你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>?。相反,仅包含代码所需的标头,例如
#include <iostream>
#include <climits> /* for INT_MAX */
#include <algorithm> /* for std::fill */
如果您的输入中有一个无效字符(非数字),您很可能会触发自己的错误。除非您检查输入后的流状态并处理 .eof()
、.fail()
和 .bad()
,否则您无法正确使用任何输入函数。请参阅std::basic_iostream(在成员功能下)
至少您需要类似于以下内容的内容,以便在输入错误时退出程序。如果您想更优雅地处理错误,请参阅 std::basic_ios::rdstate 以了解对应于 .eof()
、.fail()
和 .bad()
的错误。
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,它们的使用仅由非标准编译器扩展提供。
如评论和其他答案中所述,int idx[N];
将尝试创建一个包含 1,000,000 个整数的数组,自动存储持续时间将超过 Windows 上的堆栈大小 (1M) 并且等于每个Linux 上的总堆栈大小 (4M)。您要么需要使用 STL 库提供的容器,如 std::vector<int>
,声明 idx
作为指向 int
的指针,并使用 idx
为 new
分配存储空间. (然后您将负责使用 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()
中分配(将在退出时释放)。
不是循环填充 idx
,C++ 提供 std::fill 来处理作业。这将填充 idx
减少到:
std::fill (idx,idx + N,-1); /* use std::fill to initialize */
我可能还忽略了其他问题,您只需使用适当的编译器选项即可找到并修复这些问题。 (除了检查 n <= N
)
总是在启用警告的情况下编译,并且不要接受代码,直到它在没有警告的情况下编译。要启用警告,请将 -Wall -Wextra -pedantic
添加到您的 gcc/clang
编译字符串(还可以考虑添加 -Wshadow
以警告阴影变量)。对于 VS(Windows 上的 cl.exe
),使用 /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,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),or use std::vector
*/
const int N = 1e6 + 2;
int *idx = new int[N];
std::fill (idx,-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
宏)
检查一下,如果您还有其他问题,请告诉我。
,我认为,如果您提示输入,故障排除会更容易一些。我运行了您的代码,起初似乎没有输出任何内容,但那是因为需要先提供输入。
尝试将您的代码更改为:
#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”的输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。