<Lab1 : my menu.json 만들기>
인터넷 등에서 마음에 드는 음식점의 메뉴판을 고를 것.
앞 페이지의 구조체타입 선언부를 참고하여 4종류 이상의 값을 뽑아내서 메
뉴 정보를 만들 것.
예) 메뉴카테고리, 메뉴이름, 주문기준, 가격
해당 정보들을 토대로 json 텍스트 파일을 만들것 파일명 : mymenu.json
주의사항
하나의 키에 여러 value가 들어가는 경우 JSMN_ARRAY 사용해야 함
([ .. ] 괄호 사용)
중식메뉴와 피자메뉴로 결정, json 형식으로 만든다.
<Lab2 : mymenu.json>
parsejsonfile.c —> mystore.c로 복사한 후 기능을 구현할 것 Makefile 수정하여 target으로 mystore 추가할 것.
char *readjsonfile(const char * filename) 을 사용하여 mymenu.json 읽으면서 파싱
호출 예 :
JSON_STRING = readjsonfile(“mymenu.json”); 파싱하기
mystore.c 만들기
Makefile 수정
readjsonfile
JSON_STRING을 readjsonfile로 받아오기(경로 입력)
결과, 작아서 잘 안보이긴 하지만 위에서 본 mymenu.json이 다 읽히고 JSON_STRING으로 들어갔다.
<Lab3 : 파싱된 토큰으로 mymenu 구조체 완성>
파싱한 토큰배열과 JSON 문자열을 가지고, mymenu 배열에 구조체를 채워 넣는다.
int makemymenu(const char *json, jsmntok_t *t, int tokcount, mymenu_t * m[])
동작
파싱한 모든 토큰에서 메뉴정보를 맞춰 메뉴구조체를 만들어 구조체포인터배열에 할당한다.
파라미터
json : 읽혀진 json string, t : 파싱 토큰배열,
tokcount : 토큰갯수, m : 메뉴정보를 담을 구조체포인터배열
리턴 값 : 채운 메뉴정보(구조체)의 갯수
호출 예 :
menucount = makemymenu(JSON_STRING, t, r, mymenu);
먼저 mymenu_t 구조체를 정의해두자! 그리고 mycategory_t는 enum으로 정의한다.
makemymenu 함수를 만드는데 결국 m구조체 포인터 배열에 포인터의 성질을 이용해 메뉴의 내용을 채워넣고 메뉴의 갯수를 반환하는 함수다.
중요한 것은 메인에서 mymenu_t 구조체의 포인터 배열 mymenu[20] 을 선언해줘야 함수의 인자로 넘겨주고 그 값을 저장할 수 있는 것이다.
그 다음 메인의 말미에 makemymenu 함수를 사용한다.
*추가
t[].parent를 쓰려면 Makefile에서 사진과 같이 c파일을 o파일로 컴파일할 때 매크로를 넣어줘야 한다.
jsmn.c와 jsmn.h를 보면 parent를 쓰기위해선 JSMN_PARENT_LINKS가 선언돼야하기 때문.
결과로 8개의 메뉴를 읽었으므로 8이 나온다.
<Lab4 : 메뉴정보 출력하기>
만들어진 메뉴구조체포인터 배열의 모든 메뉴를 출력한다. void printmenu(mymenu_t *m[], int mcount);
동작
메뉴구조체 포인터 배열의 갯수만큼 화면에 메뉴정보를 출력한다. 출력 예: 각 줄마다 카테고리, 메뉴이름, 사이즈, 가격
파라미터 - m : 메뉴정보를 담고 있는 구조체포인터배열, mcount : 저장된 구조체의 갯수
호출 예 :
printmenu(mymenu, menucount);
배열의 갯수도 인자로 오고, 배열도 완성돼 있으므로 어렵지 않다.
주의할 것은 포인터이므로 '.'이 아닌 '->'를 쓴다는 것과 category를 if문으로 정해준다는 것이다.
printmenu 함수의 모습
메인에서 호출하는 모습
결과
<추가 과제>
1일 매출계산 기능 구현 (세부적인 부분은 임의로 결정해서 제작할 것)
하루 동안의 주문서 갯수만큼 반복문을 통해 메뉴번호와 주문갯수들을 입력받아 총 판매금액 및 메뉴별 판매금액합계를 계산하여 출력함.
내가만들 함수는 void salesMode(mymenu_t * m[], int mcout) 이고
호출은 salesMode(mymenu, menucount) 로 한다.
함수를 호출하면 메뉴판을 보여주고 반복으로 주문할 음식의 번호를 받는다.
1~8이 아닌 수를 받으면 종료하고 토탈값을 출력해준다.
salesMode 함수의 모습
메인에서 호출, 0번이다.
결과
[출처] Jsmn프로젝트 simple.c 수정하기 3탄(메뉴판 만들기)|작성자 희석
'기타 > JSMN' 카테고리의 다른 글
JSMN simple.c 2 수정 (0) | 2018.08.08 |
---|---|
JSMN simple.c 분석 및 응용 (0) | 2018.08.08 |
JSMN , JSON malloc, realloc 사용해서 파일 읽기. (0) | 2018.08.08 |
JSON 개요 (0) | 2018.06.22 |