2009-11-28 1 views
1

"dict.txt"라는 정렬되지 않은 사전 파일이 있습니다. 나는 파일의 단어를 배열에 넣을 수 있었고 qsort()도 내가 잘 사용하고있는 것 같다. (배열이 정렬되어있다.)bsearch() 호출에서 제시 프로그램이 중단되는 이유는 무엇입니까?

왜 이런 일이 : 나는 bsearch(), 프로그램 충돌을 부르는 나의 문제는 때

문제가 발생합니다?

gcc를 사용하여 컴파일하고 어떤 종류의 IDE도 사용하지 않으므로 디버거가 없으므로 사용 방법을 알지 못합니다.

여기에 제시된 코드에는 몇 가지 문제가있을 수 있습니다.

왜냐하면 저는 매우 새로운데 내 배경은 주로 Java입니다 (유사성에도 불구하고 단점이있는 것 같습니다. 왜냐하면 저는 OO에 너무 익숙하고 C는 분명히 OO가 아니기 때문입니다).

모든 조언을 주시면 감사하겠습니다.

int strcmp_mod(const void *p1, const void *p2) { 
    return strcmp(* (char * const *) p1, * (char * const *) p2); 
} 

int main(void) { 

int size, i; 
char **words; 

char *pItem; 
char *key = "fight"; 

char* buf = load_file("dict.txt"); if (buf == NULL) return 1; 

size = count_words(buf); 

words = (char**)malloc((size+1) * sizeof(char*)); 

for (i=0; i<size; i++) { 
    words[i] = (char*)malloc(80 * sizeof(char)); 
} 

copy_words_to_lower(buf, words, size); 
    words[size] = '\0'; 

    qsort(words, size, sizeof(char*), strcmp_mod); 

for (i=0; i<size; i++) { 
    printf("%s\n", words[i]); 
} 

pItem = (char *) bsearch(key, words, size, sizeof(char*), strcmp_mod); 

if (pItem!=NULL) 
    printf ("%s is in the array.\n", pItem); 
else 
    printf ("%s is not in the array.\n", key); 

return 0; 
} 
+1

printf()를 strcmp_mod 함수에 넣으면 ... 무엇이 (그리고 심지어 유효한 문자열 이건간에) 비교 대상을 정확히 볼 수 있으므로, 디버거. – Eric

답변

2

주소 keybsearch을 제공하십시오.

+0

+1이 나를 때린다. –

+0

고맙습니다. – dankilman

2

왜 이런 일이 발생합니까?

당신은 bsearch하는 char*key 매개 변수를 전달하고, 그러나 당신의 비교기는 * 무효화하는 char** 캐스팅의 결과를 기대하고있다.

일단 문제를 해결하면 다음 문제는 bsearch의 반환 값이 배열의 일치 항목에 대한 포인터라는 것입니다. 따라서 다시 char**char*이 아닙니다.

모든 조언을 주시면 감사하겠습니다.

디버거를 가져 오거나 코드에 많은 로깅을 추가 할 준비를하십시오.

또한 words 배열 구성은 약간 꺼져 있습니다. 작업이 끝나면 시작할 때 같은 크기가 아닌 모든 단어에 대해 버퍼를 할당하는 것이 좋습니다. 누군가가 당신에게 80 자 이상의 단어가 담긴 파일을 보내 줄지 누가 알겠는가? NULL 문자, '\ 0'을 사용하여 단어 목록을 종료 할 수 있습니다. 포인터 NULL로 종료하는 것이 좋습니다. '\ 0'은 실제로 작동합니다. 0을 말하는 또 다른 방법이고 0은 널 포인터로 변환되기 때문입니다. 그러나 그것이 당신이 의미하는 바가 아닙니다. 그리고 그 배열은 길이가 명시된 후에 사용할 때마다 size이되기 때문에 배열은 지금 당장 null-terminated 될 필요가 없다.

+0

우수 답변입니다. 내가가는대로 버퍼 할당에 대한 질문이 있습니다. copy_words_to_lower() 현재 단어의 길이를 확인한 후 동일한 구문을 사용하려고하면 malloc()을 사용할 때 튀어 나오고 일부 메모리 주소에 대한 액세스와 관련하여 오류가 발생합니다. 허용되지 않습니다. 이것이 제가 원래이 방법으로 일하는 것처럼 보였던 이유입니다. 이 문제에 대한 훌륭한 조언이 있으십니까? – dankilman

+0

발견 ... 어쨌든 고맙습니다. – dankilman

+0

또 다른 옵션은 각 단어마다 버퍼를 할당하지 않는 것입니다. 다른 용도로는 사용하지 않으므로,'buf '의 데이터를 수정할 수 있습니다. 각 단어의 끝에 NUL 바이트를 씁니다. (현재 단어 사이에 공백이나 줄 바꿈이 있습니까?) 대문자를 소문자로 바꾸고 각 단어의 시작 부분에 포인터를 쓰십시오. 정렬. 자바에서 오는 것은 아마도 약간의 해킹으로 보일 것입니다. 하나의 큰 문자열을 많은 작은 문자열로 바꾸는 것입니다. 그러나 너무 많은 메모리 할당을 피하는 것은 종종 실제적인 C 코드에서 중요한 문제입니다. –