我试图解决一个我必须排序的问题,所以我使用了标准库std::sort
函数,但在第二个测试用例中得到了错误的输出:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,i;
cin>>n;
int arr[n-1];
for(i=1;i<=n-1;i++)
cin>>arr[i];
int size=sizeof(arr)/sizeof(arr[1]);
sort(arr,arr+size);
for(i=1;i<=n-1;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
return 0;
}
I/P:
2
5
1 2 5 4
10
1 2 3 4 5 6 7 8 10
预期O/P:
1 2 4 5
1 2 3 4 5 6 7 8 10
实际运维:
1 2 4 5
2 3 4 5 6 7 8 2013562 10
发布于 2019-07-08 15:30:41
首先,int arr[n-1];
是一个可变长度的数组。这实际上不是C++的一部分,尽管有些编译器会容忍它。在大多数情况下,您可以直接使用std::vector<int>(n-1);
。
但是看看这个循环:
for(i=1;i<=n-1;i++)
cin>>arr[i];
您从1
开始,一直到n-1
,但是您的数组从arr[0]
到arr[n-2]
。所以你得到了未定义的行为,因为你写的值超过了数组的大小,而且你也没有写到第一个位置(当你试图在这个未初始化的值仍然存在的情况下进行排序时,会导致更多的未定义行为)。
相反,循环应该是for(i=0;i<n-1;i++)
的,这同样适用于打印它的位置。然后,可以按以下方式对向量进行排序:
sort(arr.begin(), arr.end());
还要注意,通过执行n-1
,您总是在读取和处理用户输入的少一个值,我不确定这是否是您的意图。如果你想这样做,你也可以在读入后将n
减少一个,而不是在多个地方写n-1
。
https://stackoverflow.com/questions/56930078
复制相似问题