구조체별명, 초기화
#include <stdio.h>
typedef struct Fruit {
char name[200];
int price;
char season[200];
}F; //구조체별명
void main() {
F apple = { "사과", 1500, "가을" };
F pear = { "배", 3500, "겨울" };
F banana = { "바나나", 500, "여름" };
printf("%s %d %s\n", apple.name, apple.price, apple.season);
printf("%s %d %s\n", pear.name, pear.price, pear.season);
printf("%s %d %s\n", banana.name, banana.price, banana.season);
}
사과 1500 가을
배 3500 겨울
바나나 500 여름
위의 문제 응용
전처리, 구조체배열 만들어서 for문 반복 돌리기
#include <stdio.h>
#define L 3 //수정할 수 없는 상수, length 3으로 정의
typedef struct Fruit {
char name[200];
int price;
char season[200];
}F; //구조체별명
void main() {
F fruits[L] = { //3대신 위에서 정의한 L을 기입
{"사과", 1500, "가을"},
{"배", 3500, "겨울"},
{"바나나", 500, "여름"}
};
for (int i = 0; i < L; i++) {
//3이라는 값을 따로 선언하면 좋겠지만, 메인함수에서 선언해서 쓰면 상수여도 인식이 안된다
//F fruits[3] 구조체가 메모리에 먼저 할당 되기 때문에 애초에 3이라는 걸 인식하지 못한다
//따라서 메인함수가 읽히기 전에 전처리를 해준다
printf("%s %d %s\n", fruits[i].name, fruits[i].price, fruits[i].season);
//fruits[i]번째 방을 배열로 반복하며 하나씩 출력 된다
}
//F apple = { "사과", 1500, "가을" };
//F pear = { "배", 3500, "겨울" };
//F banana = { "바나나", 500, "여름" };
//printf("%s %d %s\n", apple.name, apple.price, apple.season);
//printf("%s %d %s\n", pear.name, pear.price, pear.season);
//printf("%s %d %s\n", banana.name, banana.price, banana.season);
}
사과 1500 가을
배 3500 겨울
바나나 500 여름
구조체 배열을 이용하여 작성하기
구조체는 한번 할당이 된 다음, 직접 접근해서 문자열을 바꾸려고 하면 문제가 발생할 수도 있다
ex)
struct Animal dog = { "Max", 10, "개껌" }; //초기화
dog.name = "max"; =>직접 접근해서 문자열 바꾸려고 할 때 오류표시가 생긴다
strcpy_s(dog.name,sizeof(dog.name),"max");
구조체와 배열, 구조체와 포인터 활용하여 위의 문제 적용해보기
#include <stdio.h>
#include <stdlib.h>
#define L 3 //수정할 수 없는 상수, length 3으로 정의
typedef struct Fruit {
char name[200];
int price;
char season[200];
}F; //구조체별명
void main() {
F* fruits = 0;
int size = 0;
printf("과일의 개수를 입력하세요\n");
scanf_s("%d", &size);
fruits = (F*)calloc(size,sizeof(F));
//F타입의 포인터로 형변환, calloc 동적배열로 초기화
for (int i = 0; i < L; i++) {
printf("%d번째 과일명: ", i+1);
scanf_s("%s", fruits->name, sizeof(fruits->name));
printf("%s 가격", fruits->name);//name은 배열이라서 주소가 그대로 있음 &필요없음
scanf_s("%d", &fruits[i].price); //price는 일반변수, 저장공간 즉 값이다. &로 주소값 알려줘야함
//fruits는 구조체가 아니라 배열!!
//fruits[]대괄호로 한번 접근해야 구조체가 있는것
printf("%s 시즌", fruits->name);
scanf_s("%s", fruits->season, sizeof(fruits->season));
//fruits가 배열이므로 일단 "한 번" 접근 한다 . 도트 한개 한번
//-> 표시는 "두 번" 접근한다는 의미! . . 도트 두개(->) 두번
printf("%s %d %s\n", fruits->name, fruits[i].price, fruits->season);
}
}
과일의 개수를 입력하세요
3
1번째 과일명: apple
apple 가격 3000
apple 시즌 spring
apple 3000 spring
2번째 과일명: banana
banana 가격 1500
banana 시즌 summer
banana 1500 summer
3번째 과일명: peach
peach 가격 2900
peach 시즌 summer
peach 2900 summer
printf("%s 가격", fruits->name);//name은 배열이라서 주소가 그대로 있음 &필요없음
scanf_s("%d", &fruits[i].price); //price는 일반변수, 저장공간 즉 값이다. &로 주소값 알려줘야함
//fruits는 구조체가 아니라 배열!!
//fruits[]대괄호로 한번 접근해야 구조체가 있는것
//fruits가 배열이므로 일단 "한 번" 접근 한다 . 도트 한개 한번
//-> 표시는 "두 번" 접근한다는 의미! . . 도트 두개(->) 두번
'Dev. > C++' 카테고리의 다른 글
구조체 종합문제 (0) | 2022.04.06 |
---|---|
구조체배열 응용문제 (0) | 2022.04.05 |
메모리의 동적할당/malloc (0) | 2022.04.04 |
구조체 (0) | 2022.04.04 |
포인터의 포인터/싱글포인터/더블포인터 (0) | 2022.04.01 |
댓글