簡體   English   中英

如何使用strcpy將字符串數組存儲到結構中?

[英]How can I use strcpy to store string arrays into a struct?

我在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;

extern card deck[];

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

我的主要檔案:

#include "CardOps.h"

card deck[DECKSZ];

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(card deck[]) {
    static const char *pipNames[] = {"Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"};
    static const char *suitNames[] = {"Spades","Hearts","Diamonds","Clubs"};
    int i;
    for (i = 0; i < DECKSZ; i++) {
        strcpy(deck[i].cardName, pipNames[i]);
        /*strcpy(cardName, suits[i]);*/
    }
}

int displayCards(card deck[], int numCards) {
    int i, countCards;
    if (numCards > 52)
        countCards = 52;
    else
        countCards = numCards;
    for (i = 0; i < countCards; i++) {
        printf(deck[i].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);
    /*labelCards(deck);*/
    displayCards(deck,52);
    shuffleDeck(deck);
    return EXIT_SUCCESS;
}

我在labelCards()函數中使用strcpy()時遇到問題。 有人請幫我strcpy()嗎? 謝謝!

我認為使用sprintf比使用strcpy更好。 這是因為sprintf返回一個整數,告訴你寫入目標緩沖區的字符數。 有了這些知識,你就知道在你想寫西裝時從哪里開始寫作。

 //copy the name into the buffer at cardname
int written = sprintf(deck[i].cardName, "%s" pipNames[i%13]);
 //copy the suit name into the same buffer, but advanced by however many chars we just wrote
sprintf(deck[i].cardName + written, "%s", suits[i/13]);

現在它會說像FiveHearts和AceClubs這樣的東西......不是最佳的,但你可以在這里工作。

編輯: user3386109建議一種比我更聰明的方法:

sprintf(deck[i].cardName, "%s of %s", pipNames[i%13], suits[i/13] );

一個sprintf肯定比我正在做的兩個更好。 在某些情況下,知道如何繼續使用sprintf從中斷寫作是有價值的,但這不是其中之一。 我還根據user3386109的修正案更正了pipNamessuits索引的邏輯。

在:

void labelCards(card deck[]) {
    static const char *pipNames[] = {"Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"};
    static const char *suitNames[] = {"Spades","Hearts","Diamonds","Clubs"};
    int i;
    for (i = 0; i < DECKSZ; i++) {
        strcpy(deck[i].cardName, pipNames[i]);
        /*strcpy(cardName, suits[i]);*/
    }
}

i > 12時, pipNames[i]訪問不存在的數組元素。

您需要像在initDeck那樣執行pipNames[i % 13] 感覺標簽應該在initDeck函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM