Вывод словаря в C - PullRequest
       13

Вывод словаря в C

0 голосов
/ 24 июня 2019

Я пытаюсь создать придуманный переводчик словаря.Первый раздел ввода - это сами записи, за которыми следует пустая строка, за которой следует иностранное слово.Выходными данными будут любые иностранные слова, соответствующие английскому слову, или «eh», если совпадений нет.

Вот мой код:

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

struct dictionaryEntry {
    char english[20];
    char foreign[20];
};

int CREATE_LIST(struct dictionaryEntry *list) {
    char buffer[50];
    int counter = 0;

    //fgets is necessary to detect newline
    if ((fgets(buffer, 20, stdin) == NULL))
        exit(0);

    while (buffer[0] != '\n') { 
        char english[20], foreign[20];
        sscanf(buffer, "%s %s", english, foreign);

        //Words put into list
        strcpy(list[counter].english, english);
        strcpy(list[counter].foreign, foreign);

        //End of while loop so while loop can detect it
        if ((fgets(buffer, 20, stdin) == NULL))
            exit(0);
        counter++;
    }

    return counter;

}

//Performs a linear search through array struct
void SEARCH(struct dictionaryEntry *list, int lineCount) {
    char userInput[50], buffer[50];
    int i = 0;
    bool flag = false;

    if ((fgets(buffer, 20, stdin) == NULL))
        exit(0);

    //Check to make sure no newline
    while(buffer[0] != '\n')  {
        flag = false; //Resets
        //Loops through entire array for word
        for(i = 0; i<lineCount; i++) {
            sscanf(buffer, "%s", userInput);
            //If match is found, displays English word and set flag to true
            if(strcmp(list[i].foreign, userInput) == 0){
                printf("%s\n", list[i].english);
                flag = true;
            }
        }

        //If flag is false, then match was not found; print 'eh'
        if(flag == false)
            printf("%s", "eh\n");

        if ((fgets(buffer, 20, stdin) == NULL))
            exit(0);
    }
}

int main(void) {
    int lineCount = 0;
    struct dictionaryEntry *list = malloc(lineCount * sizeof(struct dictionaryEntry));

    lineCount = CREATE_LIST(list);

    SEARCH(list, lineCount);

    for(int i = 0; i<lineCount; i++) {
        printf("English: %s\nForeign: %s\n", list[i].english, list[i].foreign);
    }

    free(list);

    return 0;
}

Когда я использую этот вход:

dog ogday 
cat atcay
pig igpay
froot ootfray
loops oopslay 

Второй индекс, кажется, изменяется к тому времени, когда он достигает окончательного оператора печати в main.Это новый вывод:

English: dog
Foreign: ogday
English: pslay

Foreign: atcay
English: pig
Foreign: igpay
English: froot
Foreign: ootfray
English: loops
Foreign: oopslay

Как я могу исправить этот вывод, чтобы соответствовать правильно?

1 Ответ

2 голосов
/ 24 июня 2019

Вы выделяете место для ноль dictionaryEntry с. Затем вы пытаетесь записать в несуществующие записи этого массива. После этого может произойти что угодно.

Возможно, вам нужно выделить какое-то пространство, возможно, перераспределить его, чтобы увеличить его при заполнении?

...