qsort, bsearch에 관해서 질문드립니다.!(구조체 사용!)
겨울c
질문 제목 :구조체 배열을 한상태에서 qsort와 bsearch(이진검색)을 하는겁니다.
질문 요약 :이진검색에서 구조체 배열을 불러오는 부분이 문제라고 생각합니다.질문 내용 : 소스로 보여드리겠습니다.
#include StdAfx.h
#include stdlib.h
#include stdio.h
#include string.h
#include malloc.h
#define MAX_COUNT 10
#define MAX_COUNTTWO 7
int compare(const void *a , const void *b);
int intcmp(const void *a , const void *b);
typedef struct animal
{
int score;
char name[20];
} STUDENT;
void main()
{
int i;
char arr[MAX_COUNTTWO][7] =
{
배용준,장동건,강수정,송창식,고은아
};
qsort (arr, MAX_COUNTTWO, sizeof(arr[0]),compare);
printf(1번);
for(i=0;iMAX_COUNTTWO;i++)
{
printf(%s \n,arr[i]);
}
//-----------------------------------------------------------------------
char *pItem;
char key[10] = 라마;
STUDENT st[MAX_COUNT] =
{
{ 1, 아나콘다 },
{ 5, 코끼리 },
{ 8, 허밍버드 },
{ 4, 달마시안 },
{ 3, 흰 돌고래 },
{ 9, 라마 },
{ 2, 버팔로 },
{ 6, 넙치 },
{ 10, 제브라 },
{ 7, 기린 }
};
printf(\n);
printf(2번\n);
qsort (st, MAX_COUNT, sizeof(st[0]),(int(*)(const void*,const void*)) compare);
for(i=0;iMAX_COUNT;i++)
{
printf(%d : %d : %s \n,i, st[i].score, st[i].name);
}printf(3번 \n);
pItem = (char*) bsearch (&key, (void*)st, MAX_COUNT, sizeof(st[0]), (int(*)(const void*,const void*))strcmp);
printf (%s \n,pItem);
if (pItem != NULL)
printf (%s is in the array!!!!!!!!!!!!!.\n,pItem);
else
printf (%s is not!!! in the array.\n,key);
}
int compare(const void *a , const void *b)
{
return strcmp( (char*)a , (char*)b );
}
int intcmp(const void *a, const void *b)
{
return(*(char *)a - *(char *)b);
}
소스가 길어서 죄송합니다. ㅜㅜ. 빨강색으로 칠한 부분이 가장큰문제라고 생각합니다.
청록색으로 색변경을 한부분은 문제가 없는 부분이고, qsort를 정상적으로 사용하고 있다는걸 보여드리기 위해 남겼습니다.bsearch를 이용해서 pItem에 저장해서 그 부분을 프린트문으로 출력하려고 합니다.하지만 pItem에서 무엇이 문제인지, 값이 전혀 저장되지를 않습니다.교수님께 여쭈어보았지만, 구조체 포인터를 공부해서 하면 된다고 하시어서 찾아봤지만.;;bsearch와 섞어 사용하려니 조금 복잡합니다. 조언부탁드리겠습니다!.!
-
츠키
답변 감사합니다!.
해봤는데.. 차이를 모르겠네요 제가 많이 모자라서 못따라 가는것 같습니다 ㅠㅠ.
계속 참고해서 해보겠습니다. 감사합니다! -
정예
int comp(const void *a , const void *b)
{
?return strcmp( (char*)a , ((STUDENT*)b)-name );
}
이런 식으로 만들어져야 하지 않을까 싶네요. -
재찬
답변 감사합니다.!
key와 구조체의 경우 (저 형식이)정해져있는 상태라고 한다면
key와 구조체를 비교해서 사용할수 있는 비교함수를 만들거나 찾아서 사용하면 되는건가요? -
율하
bsearch 의 비교함수의 첫번째 인자는 key 에 대한 포인터가 되어야 하고, 두번째 인자는 배열 요소에 대한 포인터가 되어야 합니다.
올리신 코드에서 key는 char * 이고, 배열요소는 구조체이므로 strcmp를 bsearch의 비교함수로 사용하실 수 없습니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692424 | 2차원배열 자료입력질문이요! (1) | 똘끼 | 2025-04-22 |
2692401 | 유닉스안에서 C언어를 이용한 명함 만들기 입니다; 이해안가는 부분이있네요 | 2gether | 2025-04-22 |
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |