C - Массив структур указателей добавляет 3 элемента, затем каждый добавленный новый элемент исключает предыдущие элементы, кроме первых 2 - PullRequest
0 голосов
/ 11 апреля 2019

Я пишу программу на c для анализа абзаца текста и создал 3 структуры, чтобы помочь процессу, в котором блок содержит строки, строка содержит слова, а слово содержит текст.

typedef struct word {
    int length;
    char* text;
} Word;

typedef struct line {
    int charachterCount;
    int numberOfWords;
    Word* words;
} Line;

typedef struct textBlock {
    int numberOfLines;
    Line* lines;
} Block;

Когда я пытаюсь добавить слова в мою структуру строки, первые 3 добавляют штраф. Как только я добавляю четвертое слово, третье слово становится «», и только первые 2 слова и 4-е слова записываются точно. Когда я добавляю 5-е слово, 3-е и 4-е слова становятся «», и только 1-е, 2-е и 5-е слова записываются точно. И цикл продолжается, когда добавляется больше слов, добавляются только 1-е, 2-е и последнее добавленные слова, каждый второй адрес содержит "". Вот вывод, который я напечатал:

Это ключ к тому, какая информация печатается:

Altered line: [EACH WORD IN LINE IS PRINTED FOLLOWED BY A SPACE]  : Ch#=[CHARACHTER COUNT], Word#=[WORD COUNT], LastAdd=[ADDRESS OF LAST WORD IN ARRAY], tAdd=[ADDRESS OF TEXT IN LAST WORD IN ARRAY]
Line #: 13
Text Given: the Northeastern United States and the Southern United 

Altered line: the  : Ch#=4, Word#=1, LastAdd=0x7fa7d9d00ac0, tAdd=0x7fa7d9d00ac8
Altered line: the Northeastern  : Ch#=17, Word#=2, LastAdd=0x7fa7d9d00ad0, tAdd=0x7fa7d9d00ad8
Altered line: the Northeastern United  : Ch#=24, Word#=3, LastAdd=0x7fa7d9d00ae0, tAdd=0x7fa7d9d00ae8
Altered line: the Northeastern  States  : Ch#=31, Word#=4, LastAdd=0x7fa7d9d00af0, tAdd=0x7fa7d9d00af8
Altered line: the Northeastern   and  : Ch#=35, Word#=5, LastAdd=0x7fa7d9d00b00, tAdd=0x7fa7d9d00b08
Altered line: the Northeastern    the  : Ch#=39, Word#=6, LastAdd=0x7fa7d9d00b10, tAdd=0x7fa7d9d00b18
Altered line: the Northeastern    Southern  : Ch#=48, Word#=7, LastAdd=0x7fa7d9d00b20, tAdd=0x7fa7d9d00b28
Altered line: the Northeastern     United  : Ch#=55, Word#=8, LastAdd=0x7fa7d9d00b30, tAdd=0x7fa7d9d00b38
Returning line: the Northeastern     United  : Ch#=55, Word#=8, LastAdd=0x7fa7d9d00b30, tAdd=0x7fa7d9d00b38

Вот код, который его производит:

void addWordToLine(Line* line, Word word) {
    line->charachterCount = line->charachterCount + word.length + 1;
    line->words[line->numberOfWords] = word;
    line->numberOfWords = line->numberOfWords + 1;
}

Line convertTextToLine(char* text) {
    Line newLine = emptyLine();
    Word word;
    char* newWord = malloc(sizeof(text));
    int textIndex = 0;
    int wordsIndex = 0;
    int wordIndex = 0;

    while (text[textIndex] != NIL) {
        if (text[textIndex] == ' ' || text[textIndex] == '\n') {
            newWord[wordIndex] = '\0';
            if (wordIndex != 0) {
                word = buildWord(newWord);
                newLine.words = realloc(newLine.words, sizeof(newLine.words) + sizeof(word) * 2);
                addWordToLine(&newLine, word);
                printf("Altered line: ");
                printLine(newLine);
                wordsIndex = wordsIndex + 1;
            }
            wordIndex = 0;
        } else {
            newWord[wordIndex] = text[textIndex];
            wordIndex = wordIndex + 1;
        }
        textIndex = textIndex + 1;
    }
    if (wordIndex != 0) {
        newWord[wordIndex] = '\0';
        word = buildWord(newWord);
        newLine.words = realloc(newLine.words, sizeof(newLine.words) + sizeof(word));
        addWordToLine(&newLine, word);
    }

    printf("Returning line: ");
    printLine(newLine);

    return newLine;
}

Word buildWord(char* text) {
    Word word;
    word.count = 1;
    word.text = malloc(sizeof(text));
    strcpy(word.text, text);
    word.length = getTextLength(text);
    return word;
}

Word emptyWord() {
    Word newWord;
    newWord.count = 1;
    newWord.length = 0;
    newWord.text = malloc(sizeof(char));
    return newWord;
}

Line emptyLine() {
    Line newLine;
    newLine.charachterCount = 0;
    newLine.numberOfWords = 0;
    newLine.words = malloc(sizeof(Word));
    return newLine;
}

Любая помощь в том, почему это происходит и как я могу это исправить, ценится, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...