인프런 커뮤니티 질문&답변

Solioquies님의 프로필 이미지
Solioquies

작성한 질문수

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

17.2 영화 평점관리 연습문제 해설

1번 실행하면 에러가 뜨는데 이유를 모르겠습니다..

작성

·

221

0

#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번 실행하면 저렇게 에러가 뜨고 글자가 다 깨진 상태로 나오더라구요.. 이유를 알 수 있을까요?

답변 2

0

print_all() 함수에서 조건식을 잘못 쓰셨네요.

int n = 0; n <= n_items; ++n

0

Solioquies님의 프로필 이미지
Solioquies
질문자

Solioquies님의 프로필 이미지
Solioquies

작성한 질문수

질문하기