Как присвоить char значение типа int? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь сделать пасьянс, используя структуры и связанные списки, я начал с чтения карт из файла с цветами и его значениями, поэтому у меня возникла проблема с такими картами, как 'A', 'J ',' D ',' K 'их значения должны быть установлены на 1, 11, 12, 13 соответственно.Как это сделать в случае использования следующей конструкции:

    #define J 11

    typedef struct card {
    char color[15];
    unsigned int value;
    struct card* pnext;
    struct card* pprev;
} cardsStruct;

struct card* pstart = NULL;
struct card* plast = NULL;

int main()
{
    FILE *myFile;
    cardsStruct card;
    if ((myFile = fopen("Cards.txt", "rb")) == NULL)
        return -1;
    while (!feof(myFile)){
        fscanf(myFile, "%s %u", card.color, &card.value);
        printf("%s %u\n", card.color, card.value);
    }
    fclose(myFile);
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

В комментарии вы написали:

карточки будут храниться в текстовом файле как, например, "КРАСНЫЙ J"

Очевидно,, вы не можете разобрать письмо со спецификатором формата для целого числа без знака.

Так что это неправильно:

fscanf(myFile, "%s %u", card.color, &card.value);

Я предлагаю вам прочитать строку файламудро (используя fgets() или getline()), и попробуйте потом разобрать его, например, используя sscanf().Поэтому, если это не удастся проанализировать число sscanf(in, "%14s %u", out), вы можете попытаться проанализировать "%14s %c" впоследствии.

Несколько других предложений:

  • Не смешивайте реализациюсвязанный список и тип данных.
  • Определите другой тип для хранения списка, нежели для представления узла списка.
  • Разделение функций в функциях, особенно при вводе и анализе ввода.
  • Постоянно проверяйте и обрабатывайте ошибки.
  • Разъединяйте представление файла карты и представление данных в вашей программе.
  • Создайте функцию для десериализации, т. Е. Для преобразования масти и ранга.строки для перечисления значений или определенных целочисленных литералов.
  • Создайте функцию для преобразования масти в цвет вместо непосредственного сохранения цветовой строки.
  • Если вы новичок в C, то, возможно, это имеет смыслсначала разработать бизнес-логику на другом более простом языке, а затем перенести ее на C.

Для справки и дальнейшего чтения:

0 голосов
/ 20 декабря 2018

вам нужно три формы хранения карт:

  • В текстовом файле

  • для использования в программе

  • При отображении

Я думаю, что хитрость заключается в том, чтобы делать преобразования.Например, в файле лучше использовать буквы (A, J, D / Q, K), поэтому он будет удобочитаемым и легко редактируемым.при отображении вы хотите, чтобы он также был удобочитаемым.В оперативной памяти для использования в программе лучше использовать шестнадцатеричные значения, чтобы было легко выполнять вычисления.

0 голосов
/ 20 декабря 2018
switch(card)
{
  case 'A':
     value = 1;
     break;
  case 'J':
     value = 11;
     break;
  /* ... */
}
0 голосов
/ 20 декабря 2018

В C , вы можете попробовать имитировать ощущение карт от C ++ ...

int characters[128] = {0};
characters['A'] = 1;
characters['J'] = 11;
characters['D'] = 12;
characters['K'] = 13;

и напечатать это так:

printf("%s %u\n", card.color, characters['K']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...