使用数组作为计数器的输出不正确

时间:2015-05-28 05:41:56

标签: c++ arrays counter

我试图通过尝试来自codeabbey.com的问题来自学编程。

我没有在this question上获得正确的输出。

  

问题:   这是一个长度为M的数组,其数字在1 ... N范围内,其中N小于或等于20.您将通过它计算每个数字遇到的次数。

     

输入数据在第一行包含M和N.   第二行(相当长)将包含由空格分隔的M个数字。   答案应该包含N个值,用空格分隔。首先应该给出1-s的数量,第二个数量为2-s,等等。

数据输入:

  

10 3

     

1 2 3 2 3 1 1 1 1 3

正确输出:

  

5 2 3

我的输出:

  

7 3 4

您可以查看here

我的代码:

#include <iostream>
using namespace std;

int main()
{
    int arrayLength,range,a;
    cin>>arrayLength>>range;
    int array[20];
    array[20]={0};

    for(int i=0; i<arrayLength; i++)
    {   
        cin>>a;
        ++array[a-1];
    }
    for(a=0; a<range; a++)
    {   
    cout<<array[a]<<" ";
    }
    return 0;
}

没有任何错误消息或警告。此外,如果您有任何改进代码的建议,那就很好。

2 个答案:

答案 0 :(得分:1)

int array[20];
array[20]={0};

是错误的,因为它使数组未初始化并尝试初始化第21个元素(这是未定义的行为btw,因为你的数组只有20个元素,请记住索引从0开始)。使用

int array[20] = {0}; // this will initialize all elements to 0

您的代码将按预期工作。有关C ++中聚合初始化的更多详细信息,请参阅here

答案 1 :(得分:1)

array[20]={0};将第21个元素(不存在)初始化为0。 所以你必须使用int array[20] = {0};将所有20个元素初始化为零。

同样从您的代码中,您不是将元素存储到数组中。您只是在读取输入时递增相应的计数。如果是这样,那么需要将数组初始化为最大限制。只需在需要时声明数组即可。在你的情况下,

int array[range] = {0};

它将初始化一个包含三个(范围= 3个)元素的数组。