输出混洗数组时出现0

时间:2016-02-22 07:31:03

标签: c

我已经制作了一个从cases[];获取的改组类型程序,并按随机顺序排列。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void deal(void);

int cases[22] =      {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};

int main()
{

   srand(time(NULL));

  int a = 0;

  deal();

  for(a = 0 ; a < 22 ; a++)
  printf("%d \n", cases[a]);

 return 0;
}

void deal(void){
 int loop;
 int temp;
 int x;
 int y;

 for(loop = 0; loop < 50; loop++){

    x = rand() % 22;
    y = rand() % 22;

    temp = cases[x];
    cases[x] = cases[y];
    cases[y] = temp;
 }
}

然而,当我运行代码时,它会随机放置0。它来自哪里,为什么会出现?

示例输出:

6
15
0 //I don't want that
20
5
50
10
3
165
65
135
105
8
1
200
25
100
85
2
250
4

4 个答案:

答案 0 :(得分:6)

您声明了int cases[22]但是只将21个整数初始化为该数组,因此,未初始化时,最后一个元素将为0。尝试在数组的末尾添加另一个整数

答案 1 :(得分:4)

这是一个错误:Ferico Samuel的答案是正确的

这是一个补充:

而不是硬编码#include <iostream> #include "ArrayClass.cpp" using namespace std; int main() { ArrayClass<int> intArray(1); intArray.addElement(5); cout << intArray.accessElement(0); cout << intArray.accessElement(1); intArray.removeElement(0); cout << intArray.accessElement(0); return 0; } 作为案例数量,你应该编写你的程序:

22

// no explicit declaration of the size here. The compiler automatically // puts the correct size depending on the number of elements that follow. int cases[] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250}; ... for(a = 0 ; a < sizeof(cases) / sizeof(cases[0]); a++) ... sizeof(cases)数组的大小(以字节为单位) casessizeof(cases[0])数组的一个元素的大小 因此cases是数组元素的数量。

这样,您可以向sizeof(cases) / sizeof(cases[0])数组添加更多元素,而无需在程序的其他位置更改数组大小。

答案 2 :(得分:3)

您将数组声明为:

int cases[22] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};

如果你不知道,那个数组中实际上只有21个元素。因此,在C标准编译器中,非初始化值将被设置为零。要更正它,请向该数组添加一个元素。

int cases[22] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250, 500}; // add 500

事情会好起来的。

无论如何,对于这种初始化,我建议你把元素放在多行(比方说,每10个元素):

int cases[22] = {1,  2,  3,  4,  5,  6,  8,  10,  15, 20,
                 25, 35, 50, 65, 85, 100,105,135,165,200,
                 250, 500}; // add 500

并设置好格式以避免此类错误。

答案 3 :(得分:3)

数组中的元素数量错误。 C有点愚蠢,因为它的设计使得编译器只能检测数组中是否有太多元素,但是如果元素太少则永远不会。

为确保元素的确切数量,您可以声明如下数组:

#define ARRAY_ITEMS(arr) (sizeof(arr) / sizeof(*arr))
#define CASES_ITEMS 22

int cases[] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};

_Static_assert(ARRAY_ITEMS(cases) == CASES_ITEMS, "Wrong array size: cases");