我做了一个洗牌类型的程序,它从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
您声明了int cases[22]
但只在该数组中初始化了 21 个整数,因此,最后一个元素在未初始化时将为 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)
是cases
数组的大小(以字节为单位) sizeof(cases[0])
是cases
数组中一个元素的大小因此sizeof(cases) / sizeof(cases[0])
数组的元素数。
这样,您可以向cases
数组添加更多元素,而无需在程序的其他位置更改数组大小。
将数组声明为:
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
并采用漂亮的格式以避免此类错误。
中的元素数量错误。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");