그래서 저는 학교 과제를 위해이 코드를 작성하고 있습니다. 제가해야 할 일은 createMonster
데이터와 함께 동적으로 할당 된 몬스터를 readMonsters
반환하고에서 만든 몬스터에 대한 포인터 배열을 반환하는 두 가지 함수를 작성 하는 것입니다 createMonster
. 나는 협력 할 함수와 구조체를 얻는 방법을 이해하는 데 어려움을 겪고 있으며 이것이 지금까지 내가 가진 것입니다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct monster {
int id;
char *name;
char *element;
int population;
} monster;
monster* createMonster(char *name, char *element, int population)
{
monster *amonster = (monster*)malloc(sizeof(monster));
amonster->name = (char*)malloc(sizeof(char)*sizeof(name));
amonster->element = (char*)malloc(sizeof(char)*sizeof(element));
amonster->population = (int)malloc(sizeof(int)*sizeof(population));
amonster->name = name;
amonster->element = element;
amonster->population = population;
return amonster;
}
monster** readMonsters(FILE* infile, int *monsterCount)
{
char n[15], e[15];
int p;
monster **a_array = malloc(*monsterCount * sizeof(struct a*));
for (int i = 0; i < *monsterCount; i++) {
a_array[i] = malloc(sizeof(monster));
fscanf(infile,"%s %s %d",n, e, &p);
printf("%s %s %d\n", n, e, p);
a_array[i] = createMonster(n,e,p);
}
monster ***m = &a_array;
return *m;
}
int main(){
int monsterCount;
char name[15];
FILE *fp = fopen ( "in.txt", "r" );
fscanf(fp,"%d %s",&monsterCount,name);
//printf("test %d\n",monsterCount);
monster **mptr = readMonsters(fp,&monsterCount);
printf("%s %s %d\n", (mptr)[3]->name,(mptr)[3]->element,(mptr)[3]->population);
fclose(fp);
return 0;
}
입력 파일은 다음과 같습니다.
8 monsters
StAugustine Grass 12
Zoysia Grass 8
WholeWheat Bread 6
MultiGrain Bread 10
Rye Bread 10
Cinnamon Spice 5
Pepper Spice 10
Pumpkin Spice 30
그러나 내가 그것을 실행하면 처음으로 만들 때까지 작동하는 것을 볼 수 있지만 데이터에 액세스하려고 시도하면 문자열에 대한 쓰레기를 반환하며 이것이 내 출력입니다.
StAugustine Grass 12
Zoysia Grass 8
WholeWheat Bread 6
MultiGrain Bread 10
Rye Bread 10
Cinnamon Spice 5
Pepper Spice 10
Pumpkin Spice 30
`7 w├?]╨@ 10
w├?]╨@ 10
나는 함수, 포인터 등을 재정렬하려고 시도했고 온라인 가이드를 따르려고 이러한 함수의 다양한 버전을 시도했지만 매번 전혀 작동하지 않거나 쓰레기를 반환합니다. 나는 C에 대한 나의 경험이 기껏해야 적당하다는 것을 쉽게 인정할 것이기 때문에 이것이 어떻게 작동하는지 또는 어떻게 더 잘 구성 될 수 있는지 이해하는 데 도움을 찾고 있습니다.
게시 한 코드에는 다음과 같은 문제가 있습니다.
라인
amonster->name = (char*)malloc(sizeof(char)*sizeof(name));
말도 안 돼. sizeof(name)
플랫폼에 따라 32 비트 또는 64 비트 인 포인터의 크기입니다. 그러나 그 이상을 할당해야 할 수도 있습니다. strlen(name) + 1
함수에 전달되는 문자열의 길이 (널 종료 문자 포함)이므로 바이트 를 할당해야합니다 . 다음 줄에도 동일하게 적용됩니다.
amonster->element = (char*)malloc(sizeof(char)*sizeof(element));
또한 라인
amonster->population = (int)malloc(sizeof(int)*sizeof(population));
는 amonster->population
포인터가 아니기 때문에 의미 가 없습니다. 동적으로 할당 된 메모리에 대한 포인터를 저장하려는 이유는 무엇입니까? amonster->population
는 문자열이 아니라 고정 길이 변수 이기 때문에 여기에서 동적 메모리 할당이 필요 하지 않습니다 struct
.. 따라서이 줄을 삭제할 수 있습니다. amonster->population = population;
이미 가지고 있는 라인 만 있으면됩니다.
또한 라인
amonster->name = name;
당신이 원하는 것을하지 않습니다. 문자열을 복사하지 않고 포인터, 즉 메모리 주소 만 복사합니다. 그런 식으로 함수로 돌아올 때까지 매달린 포인터 가 될 포인터를 복사 합니다 main
. 실제 문자열을 복사하려면 strcpy( amonster->name, name );
. 다음 행에도 동일하게 적용됩니다.
amonster->element = element;
라인
a_array[i] = malloc(sizeof(monster));
불필요하고 메모리 누수 만 만듭니다 . 함수의 모든 구조체에 대해 이미 공간을 할당했습니다 createMonster
.
선
monster ***m = &a_array;
return *m;
불필요하게 번거롭고 다음과 같이 단순화 할 수 있습니다.
return a_array;
이러한 수정 사항을 모두 적용한 후 코드는 다음과 같아야합니다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct monster {
int id;
char *name;
char *element;
int population;
} monster;
monster* createMonster(char *name, char *element, int population)
{
monster *amonster = (monster*)malloc(sizeof(monster));
amonster->name = (char*)malloc(sizeof(char)*(strlen(name)+1)); //fixed
amonster->element = (char*)malloc(sizeof(char)*(strlen(element)+1)); //fixed
//amonster->population = (int)malloc(sizeof(int)*sizeof(population)); //redundant
strcpy( amonster->name, name ); //fixed
strcpy( amonster->element, element ); //fixed
amonster->population = population;
return amonster;
}
monster** readMonsters(FILE* infile, int *monsterCount)
{
char n[15], e[15];
int p;
monster **a_array = malloc(*monsterCount * sizeof(struct a*)); //what is struct a???
for (int i = 0; i < *monsterCount; i++) {
//a_array[i] = malloc(sizeof(monster)); //redundant
fscanf(infile,"%s %s %d",n, e, &p);
printf("%s %s %d\n", n, e, p);
a_array[i] = createMonster(n,e,p);
}
//monster ***m = &a_array; //removed
//return *m; //removed
return a_array;
}
int main(){
int monsterCount;
char name[15];
FILE *fp = fopen ( "in.txt", "r" );
fscanf(fp,"%d %s",&monsterCount,name);
//printf("test %d\n",monsterCount);
monster **mptr = readMonsters(fp,&monsterCount);
printf("%s %s %d\n", (mptr)[3]->name,(mptr)[3]->element,(mptr)[3]->population);
fclose(fp);
return 0;
}
여기 에 설명 된대로 이제 프로그램이 올바른 출력을 제공합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다