词频统计 从文件中读取几行英文句子按字典序统计词频 结果跑出来总有段错误 望大神指点!

时间:2022-06-17 17:10:54
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAXSIZE 20
typedef struct node{
int count;
char s[MAXSIZE];
struct node *next;
}list,*linkP;
FILE *fp;
linkP L = (linkP)malloc(sizeof(list));

linkP deal(char temp[],char line[]);
linkP search(char temp[],linkP L);
void PrintList(linkP L);
linkP sort(linkP L);

int main(void){
fp = fopen("article.txt","r");
L->next = NULL; 
char line[MAXSIZE];
char temp[MAXSIZE];
memset(temp,0,MAXSIZE);
while(fgets(line,1024,fp)!=NULL){
L = deal(temp,line);
}
L = sort(L);
PrintList(L);
return 0;
}

linkP deal(char temp[],char line[]){
int i,k=0;
char ch;
for(i=0;i<strlen(line);i++){
ch = tolower(line[i]);
if(ch>='a'&&ch<='z'){
temp[k] = ch;
k++;
}
else{
if(temp[0]==0){
continue;
}
else{
L = search(temp,L);
memset(temp,0,MAXSIZE);
k = 0;
continue;
}
}
}
return L;
}

linkP search(char temp[],linkP L){
linkP p,q;
int flag = 0;
p = L;
while(p){
if(strcmp(temp,p->s)==0){
p->count++;
flag = 1;
break;
}
p = p->next;
}
if(flag==0){
p = L;
while(p->next){
p = p->next;
}
q = (linkP)malloc(sizeof(list));
strcpy(q->s,temp);
q->next = NULL;
q->count = 1;
p->next = q;
p = q;
}
return L;
}

void PrintList(linkP L){
linkP p;
p = L->next;
while(p){
printf("%s %d\n",p->s,p->count);
p = p->next;
}
}


linkP sort(linkP L){
linkP p,q;
char s[MAXSIZE];
int temp;
for(p=L;p;p=p->next){
for(q=p;q;q=q->next){
if(strcmp(p->s,q->s)>0){
strcpy(s,p->s);
strcpy(p->s,q->s);
strcpy(q->s,s);
temp = p->count;
p->count = q->count;
q->count = temp;
}
}
}
return L;
}
词频统计 从文件中读取几行英文句子按字典序统计词频 结果跑出来总有段错误 望大神指点!
词频统计 从文件中读取几行英文句子按字典序统计词频 结果跑出来总有段错误 望大神指点!

8 个解决方案

#1


单步调试 ,找到报错的代码,分析代码

#2


我单步调试可以调试到最后的return 0,然后再走一步就会报错

#3


引用 2 楼 V_ermouth 的回复:
我单步调试可以调试到最后的return 0,然后再走一步就会报错


那是不是那里申请了空间,没有释放?

#4


在调试下运行,出错时可以断下来,通过调用堆栈、变量窗口等观察分析出错原因

#5


查看cpu窗口 词频统计 从文件中读取几行英文句子按字典序统计词频 结果跑出来总有段错误 望大神指点!
然而我还看不懂汇编    请教大神是哪里错了QAQ

#6


引用 3 楼 wangyaninglm 的回复:
Quote: 引用 2 楼 V_ermouth 的回复:

我单步调试可以调试到最后的return 0,然后再走一步就会报错


那是不是那里申请了空间,没有释放?

整个程序申请的空间并没有临时用来存储的,都是在最后的链表中啊 

#7


感谢各位!问题我已经找到了,是一开始的#define MAXSIZE 太小了    line[]那个要开大一点,不过速度太慢   还需要找优化的方法

#8


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#1


单步调试 ,找到报错的代码,分析代码

#2


我单步调试可以调试到最后的return 0,然后再走一步就会报错

#3


引用 2 楼 V_ermouth 的回复:
我单步调试可以调试到最后的return 0,然后再走一步就会报错


那是不是那里申请了空间,没有释放?

#4


在调试下运行,出错时可以断下来,通过调用堆栈、变量窗口等观察分析出错原因

#5


查看cpu窗口 词频统计 从文件中读取几行英文句子按字典序统计词频 结果跑出来总有段错误 望大神指点!
然而我还看不懂汇编    请教大神是哪里错了QAQ

#6


引用 3 楼 wangyaninglm 的回复:
Quote: 引用 2 楼 V_ermouth 的回复:

我单步调试可以调试到最后的return 0,然后再走一步就会报错


那是不是那里申请了空间,没有释放?

整个程序申请的空间并没有临时用来存储的,都是在最后的链表中啊 

#7


感谢各位!问题我已经找到了,是一开始的#define MAXSIZE 太小了    line[]那个要开大一点,不过速度太慢   还需要找优化的方法

#8


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止