2016-12-05 6 views
-1

私はキーボードから単語を取り出し、すべての翻訳ファイルを使ってスペイン語の翻訳を出力するプログラムを作っています。今は私の機能としてBSTを使用しています。私のコードでは、ファイルから入力されている文字列を分割するためにstrtok()を使用します。しかし、すべての単語の前に4つのランダムな文字があります。ここで私が持っているものである...ここで翻訳者がCでBSTを使用する

#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(); 
} 

はので、私は私が正しく英語の単語を検索することができないかなり確信している最初の4つの文字の私の出力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

_最初の4文字のため、私は正しくできないと確信しています... _壊れた出力は、検索が機能しないという意味ではありません。あなたが簡単にテストできるなら、あなたは物事を引き受けるべきではありません。そして、あなたの出力のスクリーンショットを投稿しないでください。テキストをコピーするだけで、どのリーダーにとっても便利です。 – Gerhardh

答えて

3

firstsecondの関数は、char *です。これらの変数へのポインタを取得すると、例えば、 &firstの場合は、タイプchar **のものが得られます。あなたの他の関数(またはフォーマットのprintf)が期待しているものと同じではありません。

変数を関数に渡すときは、アドレス演算子&を削除してください。

+0

私はそれとやってみましたプログラムがクラッシュしました。それは私のテストプリント機能にもなります。 –

+0

@DylanForsythおそらく 'findEngWord'を呼び出すときに' search'関数で同じことをするからです。また 'search'関数では、変数' exitStr'はポインタ変数ではなく、単一の 'char'です。もちろん、 'tempStr'は配列ではなく、初期化されていないポインタです。これらはすべてコンパイラによって検出されているはずです。それはあなたに警告を叫んだ?あなたはそれらを読んだのですか? –

+0

ああ、私はあなたが意味するものを参照してください。私は関数呼び出しからすべてのアドレス演算子を削除しましたが、 'openFileBST'で' insert'関数を呼び出すとクラッシュします。私はそれがフィットを投げる前に 'insert'関数呼び出しさえしないので、それが私の他の関数のいずれかであるかどうかはわかりません。途中ですぐに答えてくれてありがとう! –

関連する問題