홍정모의 따라하며 배우는 C언어 (부록)

홍정모의 따라하며 배우는 C언어 (부록)

(1개의 수강평)

48명의 수강생
C
33,000원
지식공유자 · PP TREE
17회 수업· 총 5시간 55분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 초급
이거덧글 프로필

스택 자료구조 이거덧글 2달 전
스택 자료구조에 대해 조금 궁금증이 생겨서 질문 남깁니다. 연습 문제를 풀 때 pop element Pop(Stack* stack) { if (IsEmpty(stack) == true) { element tempt = { -1 }; printf("Stack is Empty. Cannot remove\n"); return tempt;  } else { return stack->items[stack->top--]; } } 이것을 구현 하는데 오랜 시간이 걸렸는데, 이유가 이미 쌓인 메모리를 아에 지우려고 시도해서 입니다. 그런데 코드를 보면  stack->top 을 인덱스 처럼 이용해서 stack->top의 값만 바꾸어 주며 사실 저장된 값은 그대로 있어서 사용하지도 않는 값을 가지고 있는게 아닌가 하는 의문이 들었습니다. 앞에서 배운 linked-list의 경우는 free를 이용하여 메모리를 지워주는데 스택의 메모리는 계속 쌓여있는 것이 아닌가요?

1
Go9 프로필

변수 count의 활용에 대해 질문이 있습니다. Go9 3달 전
안녕하세요 선생님^^ 좋은 강의 제공해주심에 감사드립니다.강의 중 코드 내용에 대해 궁금한 점이 있어 질문드립니다. Find and delete an item 부분(91행 이후,  강의시간 기준 15:00 )에서의 질문입니다. Q. 0으로 초기화되어 선언된 count(int count = 0;)는 용도가 어떻게 되나요?- 이해가 깊지 못하여, 본 예제에 제공된 코드가 실행되는 범위 내에선 그 사용도를 알지 못하겠습니다. - 혹시 반복문이 실행됨에 따른 count의 변화를 통해 몇 번만에 갔는지를 체크하는 등의 목적을 가진 용도로 작성하셨던 건가요?  항상 좋은 강의 감사드립니다.건강하십시오. :)

1
Yang hoon Cho 프로필

1번 실행하면 에러가 뜨는데 이유를 모르겠습니다.. Yang hoon Cho 4달 전
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #define TSIZE 45 #define LMAX 10 struct movie { char title[TSIZE]; float rating; }; void read_file(struct movie movie_list[], int* ptr_n_items) //값 바꿀수 잇어야 하므로 포인터로 저장 { char filename[TSIZE] = { 0, }; //버퍼역할을 하는 문자의 배열 printf("읽기위한 파일 이름 입력후 엔터 눌르셈"); printf(">>"); if (scanf("%[^\n]%*c", filename) != 1) { printf("Wrong input. Terminating\n"); exit(1); } FILE* file = fopen(filename, "r"); if (file == NULL) { printf("에러 : 파일 열 수 없음"); exit(1); } int num; //파일 몇개인지 읽는 거 if (fscanf(file, "%d%*c", &num) != 1) { printf("ERROR: 잘못된 파일 포맷"); exit(1); } for (int n = 0; n < num; ++n) { if (fscanf(file, "%[^\n]%*c", movie_list[*ptr_n_items].title) != 1 || fscanf(file, "%f%*c", &movie_list[*ptr_n_items].rating) != 1) { printf("ERROR 잘못된 파일 형식"); exit(1); } *ptr_n_items += 1; } assert(*ptr_n_items == num); fclose(file); printf("%d items have been read from the file\n", *ptr_n_items); } void write_file(struct movie movie_list[], int n_items) { char filename[TSIZE] = { 0, }; printf("파일 이름 입력하고 엔터 쳐주세요"); printf(">>"); if (scanf("%[^\n]%*c", filename) != 1) { printf("Wrong input . Terminating\n"); exit(1); } FILE* file = fopen(filename, "w"); if (file == NULL) { printf("ERROR : 파일 못염\n"); exit(1); } fprintf(file, "%d\n", n_items); for (int n = 0; n < n_items; ++n) { fprintf(file, "%s\n", movie_list[n].title); fprintf(file, "%f\n", movie_list[n].rating); } fclose(file); printf("%d items have been saved to the file\n", n_items); } int input_int() //사용자로부터 정수 입력 받는 경우 많기떄문에(자주 사용해서 하나 만듬) { int input; while (1) { printf(">>"); if (scanf("%d%*c", &input) == 1) return input; else { printf("숫자 입력후 엔터 눌러주세요\n"); while (getchar() != '\n') continue; } } } int input_menu() { while (1) { printf("\n 옵션 선택후 엔터 눌러주세요\n"); printf("1.print all items   2. print an item\n"); printf("3.Edit an item 4. add an item\n"); printf("5.insert an item 6.delete an item\n"); printf("7.delete all items 8.save file\n"); printf("9.search by name 10.quit\n"); int input = input_int(); if (input >= 1 && input <= 10) return input; else printf("%d is invalid. please try again\n", input); } } void print_all(struct movie movie_list[], int n_items) { for (int n = 0; n_items; ++n) printf("%d: \"%s\", %.1f\n", n, movie_list[n].title, movie_list[n].rating); } void print_an_item(struct movie movie_list[], int n_items) { printf("Input the index of item to print\n"); int index = input_int(); if (index < n_items) printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating); else printf("invalid items\n"); } void edit_an_item(struct movie movie_list[], int n_items) { printf(" 수정하기 위한 아이템의 인덱스를 입력하세요"); int index = input_int(); if (index < n_items) { printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating); printf("새 타이틀 입력후 엔터 쳐주세요"); printf(">>"); int f = scanf("%[^\n]%*c", movie_list[index].title); printf("새 평점 입력후 엔터 쳐주세요"); printf(">>"); f = scanf_s("%f%*c", &movie_list[index].rating); printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating); } else printf("invlaid items\n"); } void add_an_item(struct movie movie_list[], int* ptr_n_items)//n_items is a pointer { if (*ptr_n_items == LMAX) { printf("NO more space\n"); return; } const int index = *ptr_n_items; printf("타이틀 입력후 엔터\n"); printf(">>"); int f = scanf("%[^\n]%*c", movie_list[index].title); printf("평점 입력후 엔터\n"); printf(">>"); f = scanf("%f%*c", &movie_list[index].rating); printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating); *ptr_n_items += 1; } void insert_an_item(struct movie movie_list[], int* ptr_n_items) { if (*ptr_n_items == LMAX) { printf("공간 없음"); return; } printf("아이템 인덱스 입력"); int index = input_int(); //memmove(&movie_list[index+1], &movie_list[index], //sizeof(struct movie) * (*ptr_n_items -index)); /*for llop implemetation*/ for (int i = *ptr_n_items - 1; i >= index; i--) { strcpy(movie_list[i + 1].title, movie_list[i].title); movie_list[i + 1].rating = movie_list[i].rating; } //뒤에서 부터 한칸씩 앞으로 떙기는 거 printf("타이틀을 입력후 엔터 쳐주세요"); printf(">>"); int f = scanf("%[^\n]%*c", movie_list[index].title); printf("새 평점 입력후 엔터 쳐주세요"); printf(">>"); f = scanf("%f%*c", &movie_list[index].rating); printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating); *ptr_n_items += 1; } void delete_an_item(struct movie movie_list[], int* ptr_n_items) { printf("아이템 인덱스 입력"); int index = input_int(); //memmove(&movie_list[index+1], &movie_list[index], //sizeof(struct movie) * (*ptr_n_items -index)); /*for llop implemetation*/ for (int i = index; i < *ptr_n_items; i++) { strcpy(movie_list[i].title, movie_list[i + 1].title); movie_list[i].rating = movie_list[i + 1].rating; } *ptr_n_items -= 1; } void search_by_name(struct movie movie_list[], int n_items) { printf("찾으려는 타이틀 입력"); printf(">> "); char title[TSIZE] = { 0, }; if (scanf("%[^\n]%*c", title) != 1) { printf("Wrong input\n"); return; } int index = 0; for (; index < n_items; ++index) { if (strcmp(movie_list[index].title, title) == 0) break; } if (index == n_items) printf("영화를 찾을 수 없읍니다 :%s\n", title); else printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating); } int main() { struct movie movie_list[LMAX]; size_t n_items = 0; read_file(movie_list, &n_items); while (1) { printf("\n"); int s = input_menu(); switch (s) { case 1: print_all(movie_list, n_items); break; case 2: print_an_item(movie_list, n_items); break; case 3: edit_an_item(movie_list, n_items); break; case 4: add_an_item(movie_list, &n_items); break; case 5: insert_an_item(movie_list, &n_items); break; case 6: delete_an_item(movie_list, &n_items); break; case 7: n_items = 0; break; //& 있는애 있고 없는 애 있는데(n_items에서) 아이템 하나 추가 도ㅟ니까 값이 변해야 되므로 주솔르 넘겨준느 거. case 8: write_file(movie_list, n_items); break; case 9: search_by_name(movie_list, n_items); break; case 10: printf("Good bye\n"); exit(0); default: printf("%d is not implemented.\n", s); } } return 0; } 소스는 이렇게 다 따라 쳤는데 1번 실행하면 저렇게 에러가 뜨고 글자가 다 깨진 상태로 나오더라구요.. 이유를 알 수 있을까요?

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스