在C中,如何将两个char数组中的两个char字符存储到整数数组中

时间:2019-01-28 00:17:21

标签: c arrays char type-conversion int

我需要从两个不同的char数组中提取字符,将它们串联在一起(而不是相加),然后将它们存储到关联的int数组索引中。然后,我需要在调用该索引时将ASCII值显示为两个字符的总和。例如,我在一个字符数组中有“ 4”,在另一个字符数组中有“ A”。.然后我希望将“ A4”存储到int [5]中。当我调用int [5]时,我想看到“ A4”。

以下是我到目前为止尝试过的内容。

int main( int argc, char *argv[] ) 
{


    short cards[52];
    char faces[] = {'A','1','2','3','4','5','6','7','8','9','J','Q','K'};
    char suit[] = {'S','D','H','C'};

    for(int i = 0; i<52;i++){
        if(i<14){
            cards[i] = (char)(10*(suit[0] - '0')+ faces[i] - '0');
        }else if(i<27){
            cards[i] = (char)(10*(suit[1] - '0')+ faces[i-14] - '0');
        }else if(i<40){
            cards[i] = (char)(10*(suit[2] - '0')+ faces[i-27] - '0');
        }else if(i<53){
            cards[i] = (char)(10*(suit[3] - '0') + faces[i-40] - '0');
        }
    }

    printf("%c", cards[5]);
}

2 个答案:

答案 0 :(得分:1)

如果按照@Govind Parmar的建议完成此方法,则绝对可以简化此方法。但是,如果您决定将卡片的花色和值存储在一个简短的变量中,则可以通过以下操作来实现。

在这里利用除以13的余数(模数)来索引脸部数组,并使用整数除以13来索引西服数组。西服首先存储在卡阵列中。然后该字节向左移动。因此,西服的值存储在高字节中(假设short为2个字节)。字节的大小由limits.h中的CHAR_BIT确定。然后对相应的面(值)数组进行按位或运算。要打印,必须将右短字节向右移动一个字节来打印西服,然后用0s(使用0xFFu)对高字节进行掩码以获取面值。

同样,不确定为什么要这样做,但是可以。

#include <limits.h>
#include <stdio.h>

int main(void) {


    unsigned short card[52] = {0};

    unsigned char faces[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', '1', 'J', 'Q', 'K'};
    unsigned char suit[] = {'S', 'D', 'H', 'C'};

    for(int i = 0; i < 52; i++) {

        card[i] = suit[i/13];
        card[i] = card[i] << CHAR_BIT;
        card[i] = card[i] | faces[i%13];
    }

    printf("%c%c", card[5] >> CHAR_BIT, card[5] & 0xFFu);
}

答案 1 :(得分:0)

我猜想您的系统上的sizeof(short)==2,字符集是ASCII,并且您相信可以用西装和卡片的数值并排填充短数组,而不会出现任何问题

继续这些假设,这是您的代码的错误之处:

suit[x] - '0'

这是将代表数字的ASCII字符转换为数字的数值的正确方法。但是,西装的值是'S', 'H', 'D','C',所以这行不通。

(suit[0] - '0')+ faces[i]-'0'

这不会在cards[i]中创建值“ <suit-value><card-value>”的表示,每个char填充short的一半。将使用数字char创建一个suit[0] - '0' + faces[i] - '0'

printf("%c", cards[5]);

打印出short的正确格式是%hd

此外,如果您要模拟一副标准纸牌,faces中纸牌“ 10”的值在哪里?

这就是我粗略地浏览您的代码所能指出的一切。

我对您的建议是将组合的花色/面孔卡表示为字符串,而不是shorts。将cards更改为char[52][3]的数组,将其初始化为零,然后创建一个遍历facessuit的循环,并使用字符串构建填充cards功能类似于snprintf