В Си, как сохранить два символа из двух массивов в массив целых - PullRequest
0 голосов
/ 28 января 2019

Мне нужно взять символы из двух разных массивов символов, объединить их (не добавить) вместе и сохранить их в ассоциированном индексе массива 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 голосов
/ 28 января 2019

Этот подход определенно упрощен, если он сделан в соответствии с предложением @Govind Parmar.Однако, если вы решили сохранить масть и ценность карты в короткой переменной, это будет достигнуто следующим образом.

Здесь используется остаток от деления (модуля) 13 для индексации массива лиц ицелочисленное деление на 13 для индексации массива мастей.Костюм сначала сохраняется в массиве карт.Затем байт сдвигается влево.Следовательно, значение масти сохраняется в старшем байте (при условии, что короткий равен 2 байта).Размер байта определяется с помощью CHAR_BIT из limit.h.Затем выполняется побитовый или соответствующий массив граней (значений).Чтобы напечатать, вы должны сдвинуть короткий правый один байт, чтобы напечатать костюм, а затем замаскировать старший байт 0 (используя 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);
}
0 голосов
/ 28 января 2019

Я предполагаю, что 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.

. Также,если вы пытаетесь смоделировать колоду стандартных игральных карт, где значение карты «10» в faces?

Это все, на что я мог бы указать кратким просмотром вашего кода.

Я рекомендую вам представлять комбинированные карты мастей / лицев в виде строк , а не shorts.Измените cards на массив char[52][3], инициализируйте его нулем, затем создайте цикл, который проходит через faces и suit и заполните cards функцией построения строк, такой как snprintf.

...