Как я могу реализовать strcpy() и сортировку структуры в C?

Я делаю небольшое приложение ANSI C, используя GCC в Ubuntu, которое использует strcpy() и сортировку.

Мой заголовок:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DECKSZ 52

typedef struct card {
    enum {ACE=1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING} pips;
    enum {SPADES, CLUBS, HEARTS, DIAMONDS} suit;
    char cardName[20];
} card;

card deck[DECKSZ];

void initDeck(card[]);
void labelCards();
void shuffleDeck(card[]);
void swap(card*,card*);

Мой основной файл:

#include "CardOps.h"

void initDeck(card deck[]) {
    int counter;
    for (counter = 0; counter < DECKSZ; counter++) {
        deck[counter].pips = (const)((counter % 13) + 1);
        deck[counter].suit = (const)(counter / 13);
    }
}

void labelCards() {
    char pips[13][6] = {"Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"};
    char suits[4][9] = {"Spades","Hearts","Diamonds","Clubs"};
    int i;
    card cardName;
    for (i = 0; i < DECKSZ; i++) {
        strcpy(cardName, pips[i]);
        strcpy(cardName, suits[i]);
    }
}

int displayCards(int numCards) {
    int i, countCards;
    if (numCards > 52)
        countCards = 52;
    else
        countCards = numCards;
    for (i = 0; i < countCards; i++) {
        printf(cardName);
    }
    return countCards;
}

void shuffleDeck(card deck[]) {
    int i, j;
    for (i = 0; i < DECKSZ; i++) {
        j = rand() % DECKSZ;
        swap(&deck[i], &deck[j]);
    }
}

void SortCards() {

}

void swap(card *c1, card *c2) {
    card temp;
    temp = *c1;
    *c1 = *c2;
    *c2 = temp;
}

int main(void) {
    initDeck(deck);
    shuffleDeck(deck);
    return EXIT_SUCCESS;
}

Я пытаюсь реализовать следующий функционал:

Функция под названием LabelCards(), которая принимает в качестве аргумента значение void и возвращает значение void. Используйте каждый из двух членов типа перечисления в колоде, чтобы назначить строку для имени карты, т. е. «Королева червей». (Вы захотите создать массив строк «Туз», «Двойка», «Три» и т. д. для точек и аналогичный массив для мастей, чтобы обрабатывать строки.) Обратите внимание, что вам нужно будет использовать strcpy(), чтобы сделать фактическое присвоение имени карты.

Функция DisplayCards(), которая принимает в качестве аргумента целое число N и возвращает целое число. Функция должна отображать имя карты первых N карт в колоде. Функция возвращает количество отображаемых карт, которое может быть меньше фактического размера колоды. Например, 53 карты не могут быть отображены в колоде из 52 карт; Мне нужно проверить это и вернуть фактическое количество отображаемых карт.

Функция под названием SortDeck(), которая принимает и возвращает пустое значение. Моя функция должна использовать алгоритм swap(), чтобы упорядочить карты в колоде сначала по их значкам, а затем по значению их масти.

Кто-нибудь, пожалуйста, помогите мне заставить работать функциональность? Спасибо!


person Benjamin    schedule 21.03.2014    source источник
comment
Этот вопрос кажется не по теме, потому что это не один конкретный вопрос, который может помочь будущим посетителям. (Здесь есть как минимум две проблемы: сортировка и strcpy.) Более уместно было бы задать два конкретных вопроса о том, как сортировать и как использовать strcpy.   -  person Adrian McCarthy    schedule 21.03.2014
comment
Хорошо, я разделю его на два вопроса. Спасибо.   -  person Benjamin    schedule 21.03.2014


Ответы (1)


Не размещайте объявление deck в заголовке. Вы должны сделать его extern и переместить объявление в основной файл.

Ваша функция initDeck индексирует массив с помощью DECKSZ, который является постоянным и выходит за пределы. Вы, вероятно, хотели использовать вместо этого counter.

labelCards пытается скопировать весь массив в одну карту. Типы не совпадают, и переменная цикла не используется.

displayCards печатает cardName, которого не существует. Предположительно, вы хотели напечатать cardName определенной карты.

person pat    schedule 21.03.2014
comment
displayCards должен печатать cardName конкретной карты, да. Как бы я использовал переменную цикла внутри labelCards? - person Benjamin; 21.03.2014
comment
Где карты, которые вы хотите пометить в labelCards? Вам действительно нужна отдельная функция для маркировки карт, или вы не можете маркировать каждую карту по мере их инициализации в initDeck? Также для локального массива строк следует использовать static const char *pipNames[] = { "Ace", ... };, и не забывайте, что индексация массива начинается с 0, а ваш туз имеет значение 1. - person pat; 21.03.2014
comment
Где в displayCards находятся карточки, которые вы хотите отобразить? Если вы передаете колоду в качестве аргумента, вы можете проиндексировать ее с помощью i и напечатать cardName этой карты. - person pat; 21.03.2014
comment
Кроме того, strcpy перезапишет целевую строку, поэтому масть заменит пункты на карте. Вы можете использовать strcpy для пипсов и strcat для масти, но тогда у вас, например, останется "AceSpades". Может быть, sprintf("%s of %s", pipNames[pips-1], suitNames[suit]) будет лучше (или snprintf, чтобы не переполняться) - person pat; 21.03.2014
comment
Хм, похоже, это задание с какими-то глупыми правилами. Я думаю, вы должны предположить, что существует одна глобальная колода, и вы должны использовать strcpy. Удачи с этим! - person pat; 21.03.2014