arrays - 作业 C 用字符串编程栈和堆

标签 arrays c string stack heap-memory

这是一项我需要帮助的家庭作业。我似乎一切正常,但我对游戏名称有疑问。正如你所看到的,我的名字没有在输出中正确显示,而且当我尝试调试时,它有很多乱码之类的。有人可以解释一下导致此问题的原因,或者给我一个 games_stack[i].name[i] 之一的示例以使其正常工作吗?

Output

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
#define PAUSE system("pause")

//Games Struct
typedef struct
{
    char name[50]; // name of game
    int mScore; // metacritic score
    char rating; // ESRB rating
}GAMES;

int main(void) {

    GAMES games_stack[MAX];

    int numElements = 10;

    int i;

    //Populate array in stack
    //games_stack[0].name[0] = "Bioshock Infinite";
    games_stack[0].name[0] = "Bioshock Infinite";
    games_stack[0].mScore = 94;
    games_stack[0].rating = 'M';

    games_stack[1].name[1] = "Half-life 2";
    games_stack[1].mScore = 96;
    games_stack[1].rating = 'M';

    games_stack[2].name[2] = "Mario Kart Double Dash";
    games_stack[2].mScore = 87;
    games_stack[2].rating = 'E';

    games_stack[3].name[3] = "Legend of Zelda: Twilight Princess";
    games_stack[3].mScore = 96;
    games_stack[3].rating = 'T';

    games_stack[4].name[4] = "Rocket League";
    games_stack[4].mScore = 86;
    games_stack[4].rating = 'E';

    games_stack[5].name[5] = "Counter-Strike: Global Offensive";
    games_stack[5].mScore = 83;
    games_stack[5].rating = 'M';

    games_stack[6].name[6] = "Assassin's Creed II";
    games_stack[6].mScore = 80;
    games_stack[6].rating = 'M';

    games_stack[7].name[7] = "Batman: Arkham Asylum";
    games_stack[7].mScore = 91;
    games_stack[7].rating = 'T';

    games_stack[8].name[8] = "Middle-eart: Shadow of Mordor";
    games_stack[8].mScore = 84;
    games_stack[8].rating = 'M';

    games_stack[9].name[9] = "Portal";
    games_stack[9].mScore = 90;
    games_stack[9].rating = 'T';

    // Create an array on the heap to store the same number of populated elements from the stack array.

    GAMES *games_heap = (GAMES*)malloc(numElements * sizeof(GAMES));

    // if memory not allocated, exit

    if (games_heap == NULL)

    {

        printf("\n Memory not allocated");

        return EXIT_FAILURE;

    }

    //Copy the values from the stack array into the dynamic array.

    for (i = 0; i < numElements; i++)

    {

        games_heap[i].name[i] = games_stack[i].name[i];

        games_heap[i].mScore = games_stack[i].mScore;

        games_heap[i].rating = games_stack[i].rating;

    }

    // print the elements from both the array

    for (i = 0; i < numElements; i++)

    {

        printf("\n Stack : ");

        printf(" Name: %c\t MetaScore: %d\t ESRB Rating: %c", games_stack[i].name[i], 
            games_stack[i].mScore, games_stack[i].rating);

        printf("\n Heap : ");

        printf(" Name: %c\t MetaScore: %d\t ESRB Rating: %c", games_heap[i].name[i],
            games_heap[i].mScore, games_heap[i].rating);

    }
    PAUSE;
    // write contents of heap to binary file

    FILE *filePtr = fopen("games.bin", "w");

    if (filePtr == NULL)

    {

        printf("Unable to open file");

        return EXIT_FAILURE;

    }

    for (i = 0; i < numElements; i++)

    {

        if (i != numElements - 1)

            fprintf(filePtr, "%c %d %c\n", games_heap[i].name[i],
                games_heap[i].mScore, games_heap[i].rating);

        else

            fprintf(filePtr, "%c %d %c", games_heap[i].name[i],
                games_heap[i].mScore, games_heap[i].rating);

    }

    fclose(filePtr);

    return EXIT_SUCCESS;

}

//end of program

最佳答案

您的代码存在几个问题:

  • 您的游戏名称是一个字符数组,因此您的游戏[i]只是一个字符。并且您不能将字符串分配给字符。你最好使用strncpy。
  • 您只能在初始化数组时将值赋给数组,因此 games_heap[i].name[i] = games_stack[i].name[i] 不起作用。此外,在本例中,您仅复制 1 个字符。
  • 使用 %s 打印字符数组。

我在这里添加了一个快速修复代码以使其基本上可以工作。抱歉,由于我不是专家,无法进一步优化它。希望这有帮助。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define GAME_NAME_LENGTH 50
#define MAX 1000
#define PAUSE system("pause")

//Games Struct
typedef struct
{
    char name[GAME_NAME_LENGTH]; // name of game
    int mScore; // metacritic score
    char rating; // ESRB rating
}GAMES;

int main(void) {

    GAMES games_stack[MAX];

    int numElements = 10;

    int i;

    //Populate array in stack
    //games_stack[0].name[0] = "Bioshock Infinite";
    strncpy(games_stack[0].name, "Bioshock Infinite", GAME_NAME_LENGTH);
    games_stack[0].mScore = 94;
    games_stack[0].rating = 'M';

    strncpy(games_stack[1].name, "Half-life 2", GAME_NAME_LENGTH);
    games_stack[1].mScore = 96;
    games_stack[1].rating = 'M';

    strncpy(games_stack[2].name, "Mario Kart Double Dash", GAME_NAME_LENGTH);
    games_stack[2].mScore = 87;
    games_stack[2].rating = 'E';

    strncpy(games_stack[3].name, "Legend of Zelda: Twilight Princess", GAME_NAME_LENGTH);
    games_stack[3].mScore = 96;
    games_stack[3].rating = 'T';

    strncpy(games_stack[4].name, "Rocket League", GAME_NAME_LENGTH);
    games_stack[4].mScore = 86;
    games_stack[4].rating = 'E';

    strncpy(games_stack[5].name, "Counter-Strike: Global Offensive", GAME_NAME_LENGTH);
    games_stack[5].mScore = 83;
    games_stack[5].rating = 'M';

    strncpy(games_stack[6].name, "Assassin's Creed II", GAME_NAME_LENGTH);
    games_stack[6].mScore = 80;
    games_stack[6].rating = 'M';

    strncpy(games_stack[7].name, "Batman: Arkham Asylum", GAME_NAME_LENGTH);
    games_stack[7].mScore = 91;
    games_stack[7].rating = 'T';

    strncpy(games_stack[8].name, "Middle-eart: Shadow of Mordor", GAME_NAME_LENGTH);
    games_stack[8].mScore = 84;
    games_stack[8].rating = 'M';

    strncpy(games_stack[9].name, "Portal", GAME_NAME_LENGTH);
    games_stack[9].mScore = 90;
    games_stack[9].rating = 'T';

    // Create an array on the heap to store the same number of populated elements from the stack array.

    GAMES *games_heap = (GAMES*)malloc(numElements * sizeof(GAMES));

    // if memory not allocated, exit

    if (games_heap == NULL)

    {

        printf("\n Memory not allocated");

        return EXIT_FAILURE;

    }

    //Copy the values from the stack array into the dynamic array.

    for (i = 0; i < numElements; i++)

    {

        strncpy(games_heap[i].name, games_stack[i].name, GAME_NAME_LENGTH);

        games_heap[i].mScore = games_stack[i].mScore;

        games_heap[i].rating = games_stack[i].rating;

    }

    // print the elements from both the array

    for (i = 0; i < numElements; i++)

    {

        printf("\n Stack : ");

        printf(" Name: %s\t MetaScore: %d\t ESRB Rating: %c", games_stack[i].name, 
            games_stack[i].mScore, games_stack[i].rating);

        printf("\n Heap : ");

        printf(" Name: %s\t MetaScore: %d\t ESRB Rating: %c", games_heap[i].name,
            games_heap[i].mScore, games_heap[i].rating);

    }
    PAUSE;
    // write contents of heap to binary file

    FILE *filePtr = fopen("games.bin", "w");

    if (filePtr == NULL)

    {

        printf("Unable to open file");

        return EXIT_FAILURE;

    }

    for (i = 0; i < numElements; i++)

    {

        if (i != numElements - 1)

            fprintf(filePtr, "%s %d %c\n", games_heap[i].name,
                games_heap[i].mScore, games_heap[i].rating);

        else

            fprintf(filePtr, "%s %d %c", games_heap[i].name,
                games_heap[i].mScore, games_heap[i].rating);

    }

    fclose(filePtr);

    return EXIT_SUCCESS;

}

//end of program

关于arrays - 作业 C 用字符串编程栈和堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272456/

相关文章:

c++ - 我究竟做错了什么? (C++ 字符串)

.net - 有没有更好的方法来删除 .NET 中字符串的尾随部分?

arrays - Fortran 90 中 double 的最大数组大小是多少?

arrays - 在 Swift 中将位数组转换为结构数组

java - 使用主要监听器和构建数组来播放视频 (VLCJ) 的程序

c - 与指针比较数组末尾后的一个元素是否定义明确?

c - 如何忽略 C 中的某些整数输入

c - 错误 : ‘struct addrinfo’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]|

java - 尝试填充并返回对象 HashMap 中的列表

c++ - gcc 链接的默认库?