2016-12-05 87 views
-1

譯者所以我正在製作一個程序,它可以從鍵盤輸入一個單詞並輸出西班牙語翻譯,使用帶有所有翻譯的文件。現在我使用BST作爲我的功能。在我的代碼中,我使用strtok()來分解從文件輸入的字符串。但是,每個單詞前面都有四個隨機字符。以下是我有...BST in C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define SIZE 8001 

// BST code 
struct BSTnode{ 
    char engWord[128], spanWord[1000]; 
    struct BSTnode *left, *right; 
}; 

struct BSTnode *root = NULL; 

struct BSTnode *newBSTNode(char *engWord, char *spanWord){ 
    struct BSTnode *newNode; 
    newNode = (struct BSTnode*)malloc(sizeof(struct BSTnode)); 
    strcpy(newNode->engWord, engWord); 
    strcpy(newNode->spanWord, spanWord); 
    newNode->left = newNode->right = NULL; 
    return newNode; 
} 

void insert(char *engWord, char *spanWord){ 
    struct BSTnode *parent, *current, *newnode = NULL; 
    int res = 0; 
    if(root == NULL){ 
     root = newBSTNode(engWord, spanWord); 
     return; 
    } 
    for(current = root; current != NULL; 
    current = (res > 0)?current- >right:current->left){ 
     res = strcasecmp(engWord, current->engWord); 
     parent = current; 
    } 
    newnode = newBSTNode(engWord, spanWord); 
    res > 0?(parent->right = newnode):(parent->left = newnode); 
    return; 
} 

void findEngWord(char *str){ 
    struct BSTnode *temp = NULL; 
    int flag = 0, res = 0; 
    if(root == NULL){ 
     printf("FAIL!!!!!!"); 
     return; 
    } 
    temp = root; 
    int counter = 1; 
    while(temp){ 
     if((res = strcasecmp(temp->engWord, str)) == 0){ 
      printf("\t%s\n\t%d BST nodes", temp->spanWord, counter); 
      flag = 1; 
      break; 
     } 
     temp = (res > 0)?temp->left:temp->right; 
     counter++; 
    } 
    if(!flag) 
     printf("\t---NOT found (in BST)\n\t%d BST nodes", counter); 
    return; 

} 

void openFileBST(){ 
    // open file 
    FILE* filePnt = fopen("Spanish.txt", "r"); 
    char input[500], *first, *second; 

    // If file is invalid 
    if(filePnt == NULL){ 
     printf("Could not open file. Termination Program..."); 
     exit(0); 
    } 

    while(fgets(input, 500, filePnt) != NULL){ 
     first = strtok(filePnt, "\t"); 
     second = strtok(NULL, "\n"); 
     // Test prints 
     printf("%s\n", &first); 
     printf("%s\n", &second); 

     insert(&first, &second); 
    } 
    fclose(filePnt); 
} 

void search(){ 
    char *tempStr, exitStr = "-1"; 

    // Ask user to input word 
    printf("Enter a word you want to have translated. (type -1 to exit) 
     \n-------------------------\n"); 
    while(1){ 
     printf("\n- "); 
     fgets(tempStr, 99, stdin); 

     // Failed exit statement 
     //if(strcmp(tempStr, exitStr) == 0){ 
     // printf("test"); 
     // break; 
     //} 


     findEngWord(&tempStr); 
    } 
} 

int main() 
{ 
    openFileBST(); 
    search(); 
} 

這裏是我的輸出enter image description here

因爲前四個字符中的一個圖像我敢肯定,我不能正確搜索英文單詞。這是我的strtok函數,還是我的代碼?謝謝你們提前幫忙!

+0

請參閱[如何完成一個最小,完整和可驗證的示例](/ help/mcve)。 –

+1

在'search'函數中,你有'char * tempStr'和'fgets(tempStr,99,stdin);'那將無法正常工作,因爲'tempStr'在它被使用之前沒有被初始化,所以它沒有指向有效的記憶。要修復它,請將聲明更改爲'char tempStr [100]'。此外,對「findEngWord」的調用應該是「findEngWord(tempStr)」,不要使用&符號。 – user3386109

+0

_因爲前四個字符,我很確定我不能正確地... ...輸出不一致並不意味着搜索不起作用。如果您可以輕鬆測試,則不應假設。請不要發佈你輸出的截圖。只需複製文本對任何讀者來說都更方便。 – Gerhardh

回答

3

openFileBST函數中,變量firstsecond的類型爲char *。現在,如果你得到一個指向這些變量的指針,例如&first,你會得到類型爲char **的東西。與您的其他功能(或格式爲"%s"printf)所期望的不同。

將變量傳遞給函數時刪除運算符&的地址。

+0

我想這樣做,並在程序崩潰。它甚至會讓我的測試打印功能。 –

+0

@DylanForsyth可能因爲你在調用findEngWord時在'search'函數中做了同樣的事情。同樣在'search'函數中,變量'exitStr'不是*指針變量,而是單個'char'。當然'tempStr'不是一個數組,而是一個未初始化的指針。所有這些都應該由編譯器找到。它確實對你發出警告?你讀過他們了嗎? –

+0

啊我明白你的意思了。我從函數調用中刪除了所有的地址操作符,但是當我在'openFileBST'中調用我的'insert'函數時,它會崩潰。我不確定它是否是我的其他函數,因爲在它拋出適配之前它甚至不會調用「insert」函數。順便再次感謝您的快速回答! –