数组的最后一个元素自动获取垃圾

Array last element automatically gets garbage

本文关键字:获取 最后一个 元素 数组      更新时间:2023-10-16

我得到了这个输出

学习如何使用数组,我做了一个练习来检查数组是否按升序排列,在第一次运行后,这就是我得到的,我找不到问题所在。

当我打印数组时,它在最后一个数组中显示了一些垃圾。

#include <iostream>
using namespace std;
const int CAPACITY1 = 5;
int main()
{
int arr1[CAPACITY1];
bool a = false;
//init the first input
cout << "Enter 6 numbers: " << endl;
cin >> arr1[0];
int max = arr1[0];
int NoE = 1;
//init the loop to insert numbers
for (int i = 1; i <= CAPACITY1; i++) {
    cout << "Enter 6 numbers: " << endl;
    cin >> arr1[i];
    NoE++;
    //check if input is bigger than max
    if (arr1[i] > max) 
        max = arr1[i];
    else
        a = true;
}
if (a == true)
    cout << "The array is not in an ascending order" << endl;
else
    cout << "The array is in an ascending order" << endl;
cout << NoE;
//end
cout << endl;
return 0;
}

C++中数组中的索引是从零开始的。这意味着,声明为T arr[N]的容量为N的数组的索引从0开始,到N - 1结束。

若要使用for循环访问此类阵列,请使用此

for (int index = 0; index < N; ++index)

这里的循环从1到5:

for (int i = 1; i <= CAPACITY1; i++) {
    cout << "Enter 6 numbers: " << endl;
    cin >> arr1[i];

所以你只输入了五个数字,你从来没有在arr1[0]中输入任何东西,你确实在arr[5]中输入了一些无效的东西。

除此之外,我怀疑你可能错过了练习的要点。如果这是一项家庭作业,那么我想他们希望你对现有数组进行迭代,并报告它是否按升序排列。

您的for循环是错误的,并且超出了界限。请注意,C++中的数组从0开始,而不是从1开始。正确的循环如下:

for (int i = 0; i < CAPACITY1; i++) {
    cout << "Enter 6 numbers: " << endl;
    cin >> arr1[i];
    NoE++;
    //check if input is bigger than max
    if (arr1[i] > max) 
        max = arr1[i];
    else
        a = true;
}

这两行:

int CAPACITY1 = 5;
int arr1[CAPACITY1];

意味着你的数组arr1的大小是5,也就是说,它有5个元素,从0到4。尝试访问位置5处的元素是错误的。

也就是说,在你的cout信息中,你谈论的是6个数字。如果要存储6个元素,请将CAPACITY1的值更改为6,例如:

const int CAPACITY1 = 6;

根据您的评论,我认为您对数组的大小感到困惑,可能是因为您听到过"最后一个元素的索引总是偏离1"之类的话。是的,但这并不意味着要存储6个元素,在定义它时应该使用数字5!如果你想要6个元素,大小必须是6,这里没有陷阱。棘手的部分是索引将从0开始,因此最后一个元素位于位置[size - 1],而不是[size]。澄清:

如果声明int arr1[5];,则将有5个元素,索引范围从0到4。
如果您声明int arr1[6];,您将有6个元素,索引范围从0到5。

顺便说一句,这说明了为什么避免硬编码数字(在本例中为6)并始终使用变量是一个好主意。尝试

cout << "Enter " << CAPACITY1 << " numbers: " << endl;

这样,数组的大小和消息将始终匹配。

总之,如果你想使用6个数字,你需要使用

const int CAPACITY1 = 6;

并且,由于您在循环之前处理第一个元素(索引为0),因此循环必须从1开始,并运行到索引为5的最后一个元素,因此:

for (int i = 1; i < CAPACITY1; i++) {

顺便说一句,检查数组是否按升序排列的逻辑令人困惑。对您来说,a == true意味着它是而不是升序。它是有效的,但它是反直觉的。我建议更改它。