arrays - 作业 C 编程堆栈和带字符串的堆
问题描述
这是一项家庭作业,我需要一些帮助。我似乎一切正常,但我对游戏的名称有疑问。正如你所看到的,我的名字没有正确显示在输出中,也没有在我尝试调试时出现,它有很多乱码等等。有人可以解释一下是什么原因造成的,或者给我一个例子,games_stack[i].name[i]
让它正常工作吗?
#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
解决方案
您的代码有几个问题:
- 您的游戏名称是一个字符数组,因此您的 game[i] 只是一个字符。而且您不能将字符串分配给字符。你最好使用 strncpy。
- 您只能在初始化时将值分配给数组,因此 games_heap[i].name[i] = games_stack[i].name[i] 不起作用。此外,在这种情况下,您只复制 1 个字符。
- 使用 %s 打印一个 char 数组。
我在这里添加了一个快速修复代码以使其基本工作。抱歉,由于我不是专家,因此无法对其进行更多优化。希望这有帮助。
#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
推荐阅读
- c# - 在 Unity 中随着时间(或旋转)从一个地方移动到另一个地方
- sql - 配置 DataGrip 以在执行时默认运行整个脚本
- azure - Azure 应用服务 - 如何将端点(不是 IP 地址)列入白名单
- css - 无法在 atom mac 上保存 sass (.scss) 文件
- c++ - BOOST_STRONG_TYPEDEF 和移动语义
- javascript - 自定义类型检查的状态检查
- excel - 防止删除某些列
- python - 使用 Python 进行 Pandas 样式设置
- acumatica - 如何通过 Acumatica 代码为电子邮件活动添加通知模板
- json - 使用 Scala 使用 Json4s 从 JSON 中提取字符串