#include <stdio.h>
#include <stdlib.h>
struct Person {
char name[30];
int age;
};
int main()
{
struct Person *p[5];
// 5명의 인적 정보를 사용자로부터 입력받는다
for (int i = 0; i < sizeof(p) / sizeof(struct Person *); i++)
{
p[i] = malloc(sizeof(struct Person));
scanf("%s %d\n", p[i]->name, &p[i]->age);
}
// 나이가 가장 많은 사람을 출력한다 : 정렬필요
int temp = 0;
int biggest = 0;
for (int i = 0; i < sizeof(p) / sizeof(struct Person *) - 1; i++)
{
if ( p[i]->age > p[i+1]->age )
{
temp = p[i];
p[i]->age = p[i+1] -> age;
p[i+1] = temp;
}
printf("%s\n, temp -> name);
}
for (int i = 0; i < sizeof(p) / sizeof(struct Person *); i++)
{
free(p[i]);
}
return 0;
}
잘모르겠어요... 올바른 예시답안좀 보여주시면안되나요..
머리터질거같은데.. 왜 책에는 답지가 없는지..
scanf 입력에 \n이 있으면 안 됩니다.
입력은 다음처럼 받아야 합니다.
scanf("%s %d %s %d %s %d %s %d %s %d",
p[0]->name, &p[0]->age,
p[1]->name, &p[1]->age,
p[2]->name, &p[2]->age,
p[3]->name, &p[3]->age,
p[4]->name, &p[4]->age
);
가장 나이가 많은 사람을 찾을 때는 먼저 변수 두 개를 선언합니다. 첫 번째 변수는 나이를 비교할 때 사용할 임시 나이 변수(이하 age), 두 번째는 가장 나이가 많은 사람의 인덱스를 저장할 변수(이하 oldestIndex)입니다. age와 oldestIndex를 선언한 뒤에는 모두 0을 저장합니다.
int age = 0; int oldestIndex = 0;
반복문 안에서 임시 나이 변수 age와 현재 요소의 나이를 비교해서 현재 요소의 나이가 많으면 age에는 현재 요소의 나이를 저장하고, oldestIndex에는 현재 요소의 인덱스를 저장합니다. 이 상태로 마지막 요소까지 반복하면 가장 나이가 많은 사람의 인덱스가 oldestIndex에 저장됩니다.
for (int i = 0; i < sizeof(p) / sizeof(struct Person *); i++)
{
if (age < p[i]->age)
{
age = p[i]->age;
oldestIndex = i;
}
}
반복문에서 검사가 끝났으면 printf로 가장 나이가 많은 사람의 이름 p[oldestIndex]->name을 출력하면 됩니다.
printf("%s\n", p[oldestIndex]->name);
입력받을 때 아래처럼 받아야한다고 했는데
scanf("%s %d %s %d %s %d %s %d %s %d",
p[0]->name, &p[0]->age,
p[1]->name, &p[1]->age,
p[2]->name, &p[2]->age,
p[3]->name, &p[3]->age,
p[4]->name, &p[4]->age
);
언제는 &가 붙고 언제는 안붙는데 좀 헷갈려서 제대로 설명해주실수 있나요??
struct Person {
char name[30];
int age;
};
Person 구조체에서 name은 배열 이름이고, 배열 이름은 주솟값으로 변환됩니다. 따라서 &가 없어도 char 배열, 문자열을 받을 수 있습니다.
age는 int이고, 값입니다. 따라서 age로는 값에만 접근하게 되니, age 위치를 전달하려면 주솟값으로 변환해야 합니다. &age라고 써야 합니다.
struct Person *p[5];
*과 []이 함께 쓰이면 []가 우선순위가 높습니다.
p는 array 5 of pointer to struct Person라고 읽습니다. Person 구조체 포인터가 5개 들어있는 배열이라는 뜻입니다.
즉, 배열에 들어 있는 것은 Person 구조체에 대한 포인터 5개라는 뜻입니다. 포인터와 관련된 타입은 항상 영어로 읽는 습관을 들이는 게 좋습니다.
p는 배열 이름입니다. array 5니까 p[0]~p[4]까지 쓸 수 있고, 그 이상은 범위를 벗어나니 잘못된 코드입니다.
p[0]에 들어 있는 것은 pointer to sturct Person입니다. Person 구조체를 가리키는 포인터입니다. 포인터에서 멤버를 가리킬 때는 ->를 씁니다.
따라서 p[0]->name, p[0]->age로 접근합니다.
p[0]->name에서 name은 구조체에 배열로 선언되어 있고, 그 자체가 주솟값으로 처리되니까 &를 쓸 필요가 없습니다.
p[0]->age는 int이고, 값이니까 바로 입력받을 수 있습니다. 주소로 알려줘야 하므로 &p[0]->age가 됩니다.
[]과 ->의 연산자 우선순위가 높으므로 먼저 해석되고, 우선순위가 낮은 &가 마지막에 해석됩니다. []과 -> 중에서는 []가 더 높은 우선순위를 갖습니다.