Итак, я почти закончил с этой программой для своего последнего проекта, и я получаю ошибку сегментации ... Программа будет делать все правильно и выводит на экран все, но не выходит из функции printWordLength()
. выводит ошибку сегментации в самом конце, я уверен, что это простое исправление, но в данный момент мой мозг дает сбой. (Прокрутите до самого низа, чтобы найти функцию печати виновника.
Если вы просто хотите использовать мой код, не стесняйтесь.
Цель. Эта программа содержит двусвязный список, который будет читать файл, введенный в качестве аргумента командной строки, читать каждую строку из файла, размечать каждое слово из строки и для каждого слова помещать его в Структура Word Length в зависимости от ее длины, а затем помещает ее в структуру word_count в зависимости от строки слова и подсчитывает вхождение каждого слова в файле.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DELIM " ,.+-=!?:;\t"
#define MAXLINE 25000
typedef struct word_count
{
char * word;
int count;
struct word_count *next;
struct word_count *prev;
} WORD;
typedef struct word_length_count
{
int length;
int count;
WORD * words;
struct word_length_count *next;
struct word_length_count *prev;
} WLENGTH;
int splitIntoWords(char line[]);
void processLength(char * word);
void processWord(char * word, WORD * wordCount);
void printWordLength();
WLENGTH * createWordLength(char *word);
WORD * createWordCount(char *word);
WLENGTH * wordLength = NULL;
int main(unsigned int argc, unsigned char *argv[]){
FILE *fpin;
char line[MAXLINE];
int totalWordCount = 0;
if((fpin = fopen(argv[1], "r")) == NULL)
{
printf("Can't open input file.\n");
exit(-1);
}
printf("This is the words all tokenized from the input!\n");
while(fgets(line, MAXLINE, fpin) != NULL)
{
line[strcspn(line, "\n")] = '\0';
if(line[0] == '\0')
continue;
totalWordCount += splitIntoWords(line);
}
printf("Total number of words is: %d\n", totalWordCount);
printWordLength();
printf("\nFINISHED!");
}
int splitIntoWords(char line[])
{
char *word;
int count=0;
word = strtok(line, DELIM);
for(;word != NULL;)
{
count++;
printf("%s\n", word);
processLength(word);
word = strtok(NULL, DELIM);
}
return count;
}
void processLength(char * word)
{
WLENGTH *wLCounter = NULL;
WLENGTH *wLLast = NULL;
if(wordLength == NULL)
{
wordLength = createWordLength(word);
return;
}
wLCounter = wordLength;
while(wLCounter != NULL)
{
if(strlen(word) == wLCounter->length)
{
++wLCounter->count;
processWord(word, wLCounter->words);
return;
}
wLLast = wLCounter;
wLCounter = wLCounter->next;
}
wLLast->next = createWordLength(word);
}
void processWord(char * word, WORD * wordCount){
WORD * wCounter = NULL;
WORD * wLast = NULL;
if(wordCount == NULL)
{
wordCount = createWordCount(word);
return;
}
wCounter = wordCount;
while(wCounter != NULL)
{
if(strcmp(word, wCounter->word) == 0)
{
++wCounter->count;
return;
}
wLast = wCounter;
wCounter = wCounter->next;
}
wLast->next = createWordCount(word);
}
WLENGTH * createWordLength(char *word)
{
WLENGTH *wLCounter = NULL;
wLCounter = (WLENGTH*)malloc(sizeof(WLENGTH));
//wLCounter->count = (int*)malloc(int));
//wLCounter->length = (int*)malloc(int));
wLCounter->words = createWordCount(word);
wLCounter->count = 1;
wLCounter->length = strlen(word);
wLCounter->next = NULL;
return wLCounter;
}
WORD * createWordCount(char *word)
{
WORD *wCount = NULL;
wCount = (WORD*)malloc(sizeof(WORD));
wCount->word = (char*)malloc(strlen(word+1));
strcpy(wCount->word, word);
wCount->count = 1;
wCount->next = NULL;
return wCount;
}
void printWordLength(){
WLENGTH * temp = wordLength;
WORD * tempWORD = wordLength->words;
while(temp != NULL)
{
tempWORD = temp->words;
printf("\nFor Word Length: %d : There are: %d occurances!\n", temp->length, temp->count);
while(tempWORD != NULL)
{
printf("\t%s\toccurs:%d\n", tempWORD->word, tempWORD->count);
tempWORD = tempWORD->next;
}
temp = temp->next;
}
}
Я не получал ошибок сегментации, пока не добавил цикл while для tempWORD
. Но момент, когда у меня пукает мозг, заключается в том, что я не знаю, в чем проблема. Может проблема с указателем?
temp != NULL
перед назначениемtempWORD = temp->words
. Если только вы не намеревались выполнитьtempWord = temp->words
задание перед переходом к временному ›следующему - person happydave   schedule 03.05.2012