2

我想出了一个学习 C 的项目,但我有点碰壁了。该项目只是一个纸牌游戏,其中玩家有两套卡片,一套是一套大小的套牌,另一套是他们的卡片集合,可以根据需要做大。卡片结构如下:

struct card {   
    char name[256];
    char special[256];
    char type[100];
    char rarity[100];
    int points;
};

然后我有一个名为 coll.txt 的集合文件

first card goes here 50
second card goes here 70
...

然后我有一个(草率的)函数从文件中读取并将其存储到临时卡中:

void read_into_collection(FILE *f) {
    char *file_text;
    char *token;
    int i;
    struct card temp;

    file_text = (char *) malloc(sizeof(struct card));

    while(fgets(file_text, sizeof(struct card), f)) {
        for(i = 1, token = strtok(file_text, " "); token; i++, token = strtok(NULL, " ")) {
            switch (i) {
            case 1:
                strcpy(temp.name, token);
                break;
            case 2:
                strcpy(temp.special, token);
                break;
            case 3:
                strcpy(temp.type, token);
                break;
            case 4:
                strcpy(temp.rarity, token);
                break;
            case 5:
                temp.points = atoi(token);
                break;
            default:

                i = 0;
                break;
            }
        }
    }


    free(file_text);
}

所以当i = 6我准备好将临时卡移动到集合中并将下一张卡读入临时变量等等时。但是我该怎么做呢?我无法弄清楚实际上应该是什么集合。一开始我以为:

struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));

但是,如果我是正确的,malloc()返回一个指向一块内存的指针,并且内存不像数组那样顺序,所以我不能增加指针来存储卡。

我还尝试计算文件中的行数(每行是一张卡片),然后制作一个该大小的数组,但我得到一个错误,即该值不是恒定的。

将这些卡片作为收藏品存储的最佳方式是什么?我只想让集合成为一个非常大的数组,但我觉得这种情况经常出现在项目中,我宁愿学习如何处理它而不是采取简单的方法。

4

2 回答 2

3

但是,如果我是正确的, malloc() 返回一个指向一块内存的指针,并且内存不像数组那样顺序,所以我不能增加指针来存储卡片。

错误的。它是顺序的。你可以malloc()用来创建任何东西的数组:

mystruct* ptr = (mystruct*) malloc(sizeof(mystruct) * numberOfStructs)

for(int i = 0; i < numberOfStructs, i++) {
    ptr[i].setSomeInfo(x);
}

这是在 C 中执行此操作的标准方法。

于 2012-06-13T17:34:20.580 回答
1

我过去经常用 C 编程,这是我的最爱之一。这是我的答案。

您使用 malloc 的方式确实分配了一个数组

struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));

每次调用 malloc 都会返回一个指向内存中不同区域的指针。但是对 malloc 的调用总是返回一个连续的块。

如果已知卡的数量,您可以使用它来分配一个数组,然后像这样访问它

//added some code to prevent overflow
collection[i].name[255] = 0;
strncpy(collection[i] .name, token, 255);

如果不知道卡的数量怎么办。然后做一个链表。这是链表的主要用途,用于存储大小未知的集合的内容。

于 2012-06-13T17:42:32.583 回答