2016-12-05 3 views
-1

Так что я делаю программу, которая может взять слово с клавиатуры и выводить ее на испанский перевод, используя файл со всеми переводами. Сейчас я использую BST как свою функцию. В моем коде я использую strtok(), чтобы разбить строку, которая вводится из файла. Однако каждое слово имеет перед собой четыре случайных символа. Вот что у меня есть ...Переводчик с BST в 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 переменные first и second имеют тип char *. Теперь, если вы получаете указатель на эти переменные, например. &first, вы получаете что-то типа char **. Не то же самое, что ожидаются ваши другие функции (или printf с форматом "%s").

Удалите адрес-оператора & при передаче переменных в функции.

+0

Я пытался делать это и программа разбилась. Это даже сделает это для моей тестовой функции печати. –

+0

@DylanForsyth Вероятно, потому что вы делаете то же самое в функции 'search', когда вы вызываете' findEngWord'. Также в функции 'search' переменная' exitStr' является * not * переменной указателя, это один символ 'char'. И, конечно, 'tempStr' - это не массив, а неинициализированный указатель. Все это должно было быть найдено компилятором. Он кричал на вас предупреждения? Вы их читали? –

+0

А я понимаю, что вы имеете в виду. Я удалил все операторы адресов из своих вызовов функций, но когда я вызываю свою функцию 'insert' в' openFileBST', она выйдет из строя. Я не уверен, что это какая-то моя другая функция, потому что она даже не вызовет функцию «вставить», прежде чем она подгонит ее. Еще раз спасибо за быстрые ответы! –