So im trying to do a binary search in an array of strings called conj_str the thing is to do that i have to sort it and to that im trying to use qsort the problem is that comparsion function isnt working and its not sorting anything.
Program:
#include<stdlib.h>
#include<stdio.h>
#include <string.h>
#define MAX_CHARS 1024
#define MAX_SIZE 10000
int compare (const void *a, const void *b)
{
const char *key = a;
const char * const *arg = b;
return strcmp(key, *arg);
}
int main()
{
int i;
char conj_str[MAX_SIZE][MAX_CHARS];
size_t len = sizeof(conj_str)/sizeof(const char *);
strcpy(conj_str[0],"fcb");
strcpy(conj_str[1],"bvb");
strcpy(conj_str[2],"slb");
strcpy(conj_str[3],"fcp");
strcpy(conj_str[4],"rma");
qsort (conj_str, len, sizeof (const char *), compare);
for (i = 0; i < 5; i++) {
printf ("%d: %s\n", i, conj_str[i]);
}
}
In this call
qsort (conj_str, len, sizeof (const char *), compare);
there is specified incorrectly the size of array element. There must be
qsort (conj_str, len, sizeof ( char[MAX_CHARS]), compare);
Also this statement
int j = (int*) bsearch("fcb",conj_str,len,sizeof(const char *),compare);
does not make sense.
And in the comparison function this declaration
const char * const *arg = b;
also does not make sense.
The function can look like
int compare (const void *a, const void *b)
{
const char *key = a;
const char *arg = b;
return strcmp(key, arg);
}
and substitute this statement
size_t len = sizeof(conj_str)/sizeof(const char *);
for
size_t len = 5;
Here is your program with minor changes.
#include<stdlib.h>
#include<stdio.h>
#include <string.h>
#define MAX_CHARS 1024
#define MAX_SIZE 10000
int compare (const void *a, const void *b)
{
const char *key = a;
const char *arg = b;
return strcmp(key, arg);
}
int main()
{
int i;
char conj_str[MAX_SIZE][MAX_CHARS];
size_t len = 5;
strcpy(conj_str[0],"fcb");
strcpy(conj_str[1],"bvb");
strcpy(conj_str[2],"slb");
strcpy(conj_str[3],"fcp");
strcpy(conj_str[4],"rma");
qsort (conj_str, len, sizeof ( char[MAX_CHARS]), compare);
for (i = 0; i < 5; i++) {
printf ("%d: %s\n", i, conj_str[i]);
}
char ( *p )[MAX_CHARS] = bsearch("fcb",conj_str,len,sizeof(char[MAX_CHARS]),compare);
if ( p )
{
printf( "Found at position %zu\n", ( size_t )(p - conj_str ) );
}
else
{
puts( "Not found" );
}
}
Its output is
0: bvb
1: fcb
2: fcp
3: rma
4: slb
Found at position 1