在C中创建卡片组

时间:2015-03-18 18:26:53

标签: c arrays

我正在尝试在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

1 个答案:

答案 0 :(得分:5)

虽然C中的数组索引是从零开始的,但这并不意味着编译器会在声明的每个维度上添加1。您的声明会生成一个51x1而不是52x2的数组。对于52x2阵列使用

int deck[52][2];

您当前的实现具有未定义的行为,这会使您的程序输出不正确:访问deck[x][1]超出了数组的边界,产生了错误的输出。