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毫秒