Я пишу программу на 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;
}
Любая помощь в том, почему это происходит и как я могу это исправить, ценится, спасибо!