【问题标题】:How can I implement strcpy() and sorting of a struct in C?如何在 C 中实现 strcpy() 和结构排序?
【发布时间】:2014-03-21 14:04:04
【问题描述】:

我正在 Ubuntu 中使用 GCC 制作一个小型 ANSI C 应用程序,它使用 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 和 返回一个空白。使用中的两个枚举类型成员中的每一个 甲板为cardName分配一个字符串,即“红桃皇后”。 (你会 想要创建一个字符串数组“Ace”、“Two”、“Three”等 点子和一个类似的数组,用于处理字符串处理。) 请注意,您需要使用 strcpy() 来进行实际分配 到cardName。

一个名为 DisplayCards() 的函数,它接受一个参数作为参数 整数 N,并返回一个整数。该功能应显示 牌组中前 N 张牌的 cardName。该函数返回 显示的卡片数量,可能少于实际的牌组 尺寸。例如,一副 52 张牌中不能显示 53 张牌;一世 需要检查这个并返回实际的卡数 显示出来。

一个名为 SortDeck() 的函数,它接受并返回一个 void。我的 函数应该使用 swap() 算法来组织卡片 套牌首先按他们的点数,然后根据他们的花色值。

有人可以帮我让功能正常工作吗?谢谢!

【问题讨论】:

  • 这个问题似乎离题了,因为它不是一个可能对未来访问者有帮助的具体问题。 (这里至少有两个问题:排序和 strcpy。)问两个关于如何排序和如何使用 strcpy 的具体问题可能更合适。
  • 好的,我把它分成两个问题。谢谢。

标签: c sorting struct strcpy


【解决方案1】:

不要将deck 的声明放在标题中。您应该将其设为extern,并将声明移至主文件中。

您的initDeck 函数正在使用DECKSZ 索引数组,该数组是常量且超出范围。您可能打算改用counter

labelCards 正在尝试将整个阵列复制到一张卡中。类型不匹配,没有使用循环变量。

displayCards 打印 cardName,它不存在。大概您的意思是打印特定卡片的cardName

【讨论】:

  • displayCards 应该打印特定卡的cardName,是的。我将如何在labelCards 中使用循环变量?
  • 您要在labelCards 中标记的卡片在哪里?您真的需要一个单独的函数来标记卡片,还是不能在 initDeck 中初始化它们时标记每张卡片?此外,对于本地字符串数组,您应该使用static const char *pipNames[] = { "Ace", ... };,并且不要忘记该数组是从 0 开始索引的,但您的 ace 的值为 1。
  • displayCards,您要显示的卡片在哪里?如果您将卡片组作为参数传递,您可以使用 i 对其进行索引,并打印 that 卡片的 cardName
  • 另外,strcpy 将覆盖目标字符串,因此花色将覆盖卡片中的点数。您可以使用strcpy 来表示点数,使用strcat 来表示花色,但例如,这会让您使用"AceSpades"。也许sprintf("%s of %s", pipNames[pips-1], suitNames[suit]) 会更好(或者snprintf 这样你就不会溢出)
  • 嗯,看起来这是一个带有一些愚蠢规则的作业。我猜你必须假设有一个全局卡组,并且你必须使用 strcpy。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2013-04-25
  • 2013-01-06
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多