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