PersonalCorpus 版 (精华区)
发信人: SwordLea (飞刀李), 信区: Programming
标 题: [合集]c语言bsearch出错,怎么回事?
发信站: 哈工大紫丁香 (2003年11月24日13:48:51 星期一), 站内信件
────────────────────────────────────────
xceman (辉->乖狼*百事可乐) 于 2003年11月11日21:56:09 星期二 说道:
想直接利用c语言的库函数bsearch进行二分查找,不过运行时出错,
不知道怎么回事,请大虾指教:
首先定义一个比较函数:
int Compare( const void* sOne, const void* sTwo )
{
return strcmp( (char*)sOne, (char*)sTwo ) ;
}
然后定义调用函数:
bool function( char* s )
{
char* p = (char*)bsearch( (char*)s, &sList[0], SIZE, LENGTH*sizeof(char),
Compare ) ;
if( p == NULL )
return false ;
return true ;
}
其中sList是一个SIZE * LENGTH 的二维字符数组,存放着一些字符串,
测试使用这些字符串中的一个座位参数传给function并判断返回值,
不过每次总是返回false,找不到,不知道怎么回事??
还请大虾们指点,thanks:)
────────────────────────────────────────
xceman (辉->乖狼*百事可乐) 于 2003年11月12日10:20:31 星期三 说道:
参考一下下面的代码,是按你的程序改的,运行无误
#include <iostream>
#include <cstdlib>
char a[3][6]={
"abc" ,
"def" ,
"qxy" } ;
int Compare( const void* sOne, const void* sTwo )
{
return strcmp( (char*)sOne, (char*)sTwo ) ;
}
bool function( char* s )
{
char* p = (char*)bsearch( (char*)s, a, 3, 6 , Compare ) ;
if( p == NULL )
return false ;
return true ;
}
using namespace std ;
int main()
{
if( function( "abc" ) ){
cout << "ok!" << endl ;
}
system( "pause" );
}
【 在 xceman (辉->乖狼*百事可乐) 的大作中提到: 】
: 改过了,不行!
: 另外发现Compare函数的定义有错误,似乎应该这样写:
: int Compare( const char** psOne, const char** psTwo )
: {
: return strcmp( (char*)(*psOne), (char*)(*psTwo) ) ;
: }
: 因为它是要比较void*指向的东西,而不是void*本身。
: 调用的时候:
: char** p = (char**)bsearch( &sKey, sList, SIZE, (LENGTH)*sizeof(char),
: (int (*)(const void*, const void*))Compare ) ;
: 不过这样运行时出错,跟踪到Compare函数中,发现*psOne参数正确,是sKey表示的字符串
────────────────────────────────────────
xceman (辉->乖狼*百事可乐) 于 2003年11月12日10:20:35 星期三 说道:
thanks,搞定!
虽然语法上现在还有些稀里糊涂,好在搞定了:)
从前出错的原因是sList中的字符串没有严格排序,
我的程序中sList是从文本中读取的一些字符串,
这些穿都是严格排序的,不过我不知道文本中到底有多少这样的串,
因此给sList的size大了些,后面那些没有被填充的单元,我都给的空串,
错误就出现在这:空串比任何一个串的值都小!所以此时sList不是排好序的,
所以总是出错。
而我从前很少用这个,还以为是语法错。
呵呵,经典错误,希望大家引以为戒:)
【 在 iamxiaohan (潇寒) 的大作中提到: 】
: 参考一下下面的代码,是按你的程序改的,运行无误
: #include <iostream>
: #include <cstdlib>
: char a[3][6]={
: "abc" ,
: "def" ,
: "qxy" } ;
: int Compare( const void* sOne, const void* sTwo )
: {
: return strcmp( (char*)sOne, (char*)sTwo ) ;
: }
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.812毫秒