2012-04-01 77 views
0

我對C編程相當陌生,但盡力瞭解它。我有兩個從兩個純文本文件填充的動態字符串。一種是字典的形式,另一種是用戶輸入。我想要得到的是二進制搜索詞典中的每個用戶輸入詞,並確定它是否存在(我猜想有點拼寫檢查)。二進制搜索,strcmp中兩個字符串的動態數組C

我卡在我的二進制搜索功能:

char **dictElem; 
int dictSize; 
char **inputElem; 

int binsearch(const char *val){ 
    int pos; 
    int beg=0; 
    int end=dictSize-1; 
    int cond=0; 

    while (beg<=end){ 
    pos=(beg+end)/2; //Jump in the middle 
    if ((cond=strcmp(dictElem[pos],val)) == 0) 
     return pos; 
    else if (cond<0) 
     beg=pos+1; 
    else 
     end=pos-1; 
    } 
    return 0; 
} 

兩個dictEleminputElem通過其他方法已經閱讀並(比方說)兩種[0]元素相等字符串"aa"

我運行後,但是它總是返回0。binsearch(inputElem[0]我嘗試了strcmp(dictElem[0],inputElem[0])它返回1

我要去哪裏錯了?它比較char **和char *嗎?

UPD: 功能與加載的dictElem

void readd(FILE *file){ 
    int i=0,size=0; /* local size */ 
    char line[1024]; /* Local array for a single word read */ 
    printf("Loadingn dict...\n"); 
    while ((fgets(line,sizeof(line),file))!=NULL){ 
    dictElem=(char**)realloc(dictElem,(size+1)*sizeof(char *)); 
    dictElem[size++]=strdup(line); 
    } 
    printf("Total elements loaded: %d\n",size); 
} 

功能,讀取用戶文件非常相似,只是有點不同的格式。

+0

嘗試在整數數組上運行排序函數,如果它能正常工作,則轉到字符串。 – 2012-04-01 19:02:41

+0

你能告訴我們代碼你在哪裏分配'dictElem'和'val'嗎? – 2012-04-01 19:04:25

+0

此外,該算法被稱爲「二進制搜索」,而不是「二進制TREE搜索」,因爲沒有二叉樹,只是一個有序的數組。 – 2012-04-01 20:29:43

回答

2

你的代碼問題在這一行if ((cond=strcmp(dictElem[pos],val) == 0))。該行代碼將表達式strcmp(dictElem[pos], val) == 0的結果分配給變量cond,然後檢查cond是否爲零。 我想你的原意是condstrcmp的結果,因此你應該在==之前移動右括號。正確的行是if ((cond = strcmp(dictElem[pos], val) == 0)

還有一些其他的問題,你的代碼:

  1. 0作爲特殊的未發現的價值,但在相同的時間0可以 時返回元素在索引0
  2. 被發現使用char *val時, 最好使用const char *val,因爲此 字符串的內容不會被修改。編寫常量正確的代碼總是更好。
+0

感謝您的回答!圓括號肯定有錯誤。但是,您建議的更正的行會使if語句條件打開。儘管Carey Gregory似乎是對的那一行if((cond = strcmp(dictElem [pos],val))== 0)'我也已經把char改成了常量了,正如你所建議的那樣。 – platforma 2012-04-01 20:44:36

+0

雖然函數仍然返回'0',不管'val'我給它。 – platforma 2012-04-01 20:53:11

+0

它適用於我(儘管我手動將值分配給dictElem)。我想問題是你不設置dictSize。如果不是,請檢查您的字典是否已排序。 – 2012-04-01 22:11:22

1

你的問題是這樣的一行:

if ((cond=strcmp(dictElem[pos],val) == 0)) 

括號是給它的評價和電導率的錯誤的順序將最終總是0或1(因爲你分配比較的strcmp的結果() == 0)。試試這個:

if ((cond=strcmp(dictElem[pos],val)) == 0)