1

好的,所以我几乎完成了我的最终项目的这个程序,我收到了一个分段错误......该程序将正确执行所有操作,它会将所有内容打印到屏幕上,但是它不会退出该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。但是我的大脑放屁时刻是我不知道这个问题。也许是指针问题?

4

1 回答 1

1

在没有努力理解代码的情况下,最后一行看起来像一个问题 - 您需要在分配 tempWORD = temp->words 之前检查 temp != NULL。除非您打算在移至 temp->next 之前执行 tempWord = temp->words 分配

于 2012-05-03T02:39:02.917 回答