我正在尝试在C中创建一副牌。我想要实现这一点的方法是使用一个deck[51][1]
的二维数组,它将有52个插槽,每个插槽有2个插槽。第一个插槽将包含卡值(1-52),第二个插槽将包含套装(1-4)。
我尝试使用以下代码分配此内容:
int deck[51][1];
int i;
int j;
int suit = 1;
int main()
{
for(i=0; i<52; i++){
for(j=0; j<2; j++){
if(j==0){
deck[i][j] = i+1;
} else {
deck[i][j] = suit % 4;
}
suit++;
}
}
然后我尝试使用以下双循环打印出每张卡片的值:
for(i=0; i<52; i++){
for(j=0; j<2; j++){
printf("%i ",deck[i][j]);
}
printf("\n");
}
return 0;
}
然而,不是导致52行的卡片值跟随其套装,它只是显示一个奇怪的
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
等等,直到
51 52
52 0
我无法弄清楚为什么它没有将suit % 4
值分配给每个数组的第二项,这应该会导致整洁
1 1
2 2
3 3
4 4
5 1
6 2
7 3
8 4
答案 0 :(得分:5)
虽然C中的数组索引是从零开始的,但这并不意味着编译器会在声明的每个维度上添加1
。您的声明会生成一个51x1而不是52x2的数组。对于52x2阵列使用
int deck[52][2];
您当前的实现具有未定义的行为,这会使您的程序输出不正确:访问deck[x][1]
超出了数组的边界,产生了错误的输出。