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

时间:2016-03-22 22:41:47

标签: c++

I got this output

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

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

#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;
}

4 个答案:

答案 0 :(得分:1)

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

要使用for循环访问此类数组,请使用此

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

答案 1 :(得分:1)

这里的循环操作从1到5:

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

因此,您只需输入五个数字,而且您从未在arr1[0]中添加任何内容,而且您确实在arr[5]中放了一些无​​效的内容。

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

答案 2 :(得分:0)

你的for循环错误,并且越界。注意C ++中的数组从0开始,而不是1.正确的for循环如下:

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;
}

答案 3 :(得分:0)

这两行:

int CAPACITY1 = 5;
int arr1[CAPACITY1];

表示数组arr1的大小为5,即它有5个元素,从0到4.尝试访问位置5的元素是错误的。

那就是说,在你的cout消息中,你会谈到6个数字。如果要存储6个元素,请将CAPACITY1的值更改为6,如:

const int CAPACITY1 = 6;

根据你的评论,我认为你对数组的大小感到困惑,可能是因为你听到了类似#34的内容;最后一个元素的索引始终是1&#34;。是的,但这并不意味着要存储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表示升序。它有效,但这是违反直觉的。我建议改变它。