使用 bsearch c 在字符串数组中进行二进制搜索
doing binary search in an array of strings using bsearch c
所以我试图在一个名为 conj_str 的字符串数组中进行二进制搜索,我必须对它进行排序,而我正在尝试使用 qsort 问题是比较函数不是正在工作,但它没有对任何东西进行排序。
节目:
#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]);
}
}
在本次通话中
qsort (conj_str, len, sizeof (const char *), compare);
数组元素的大小指定不正确。必须有
qsort (conj_str, len, sizeof ( char[MAX_CHARS]), compare);
还有这个说法
int j = (int*) bsearch("fcb",conj_str,len,sizeof(const char *),compare);
没有意义。
并且在这个声明的比较函数中
const char * const *arg = b;
也说不通。
函数看起来像
int compare (const void *a, const void *b)
{
const char *key = a;
const char *arg = b;
return strcmp(key, arg);
}
并替换此语句
size_t len = sizeof(conj_str)/sizeof(const char *);
为
size_t len = 5;
这是你的程序,稍作改动。
#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" );
}
}
它的输出是
0: bvb
1: fcb
2: fcp
3: rma
4: slb
Found at position 1
这里是对代码的有效重写:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_CHARS 1024
#define MAX_SIZE 5
int compare(const void *a, const void *b)
{
return strcmp(a, b);
}
int main(void)
{
int i;
char conj_str[MAX_SIZE][MAX_CHARS];
size_t len = sizeof(conj_str) / sizeof(conj_str[0]);
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(conj_str[0]), compare);
for (i = 0; i < len; i++) {
printf ("%d: %s\n", i, conj_str[i]);
}
char *s = bsearch("fcb", conj_str, len, sizeof(conj_str[0]), compare);
puts(s ? "found" : "not found");
}
第一件事:为了让 qsort()
和 bsearch()
工作,数组中的每个字符串都应该被初始化(至少为空字符串),这就是为什么我把:
#define MAX_SIZE 5
(也因为 10000 * 1024 对于堆栈上的数组来说太多了)
那么qsort()
和bsearch()
的大小参数都是错误的,在这种情况下应该是:
sizeof(conj_str[0])
因为它是数组中包含的元素的大小。
bsearch()
return 是指向元素的指针(如果已创建),因此 char *
。
最后一行应该是:
puts(s ? "found" : "not found");
其中 s
是 bsearch()
的 return 指针。
所以我试图在一个名为 conj_str 的字符串数组中进行二进制搜索,我必须对它进行排序,而我正在尝试使用 qsort 问题是比较函数不是正在工作,但它没有对任何东西进行排序。
节目:
#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]);
}
}
在本次通话中
qsort (conj_str, len, sizeof (const char *), compare);
数组元素的大小指定不正确。必须有
qsort (conj_str, len, sizeof ( char[MAX_CHARS]), compare);
还有这个说法
int j = (int*) bsearch("fcb",conj_str,len,sizeof(const char *),compare);
没有意义。
并且在这个声明的比较函数中
const char * const *arg = b;
也说不通。
函数看起来像
int compare (const void *a, const void *b)
{
const char *key = a;
const char *arg = b;
return strcmp(key, arg);
}
并替换此语句
size_t len = sizeof(conj_str)/sizeof(const char *);
为
size_t len = 5;
这是你的程序,稍作改动。
#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" );
}
}
它的输出是
0: bvb
1: fcb
2: fcp
3: rma
4: slb
Found at position 1
这里是对代码的有效重写:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_CHARS 1024
#define MAX_SIZE 5
int compare(const void *a, const void *b)
{
return strcmp(a, b);
}
int main(void)
{
int i;
char conj_str[MAX_SIZE][MAX_CHARS];
size_t len = sizeof(conj_str) / sizeof(conj_str[0]);
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(conj_str[0]), compare);
for (i = 0; i < len; i++) {
printf ("%d: %s\n", i, conj_str[i]);
}
char *s = bsearch("fcb", conj_str, len, sizeof(conj_str[0]), compare);
puts(s ? "found" : "not found");
}
第一件事:为了让 qsort()
和 bsearch()
工作,数组中的每个字符串都应该被初始化(至少为空字符串),这就是为什么我把:
#define MAX_SIZE 5
(也因为 10000 * 1024 对于堆栈上的数组来说太多了)
那么qsort()
和bsearch()
的大小参数都是错误的,在这种情况下应该是:
sizeof(conj_str[0])
因为它是数组中包含的元素的大小。
bsearch()
return 是指向元素的指针(如果已创建),因此 char *
。
最后一行应该是:
puts(s ? "found" : "not found");
其中 s
是 bsearch()
的 return 指针。