K&R6-3节例题返回内存错误,请大佬帮忙看看bug在哪?

Adzuki2018 2019-01-13 09:49:09
代码如下,控制台窗口返回3221225477.求大神指教,小弟感激不尽

/*统计输入的文本中关键词的个数*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define MAX 999
#define BUFFSIZE 100
char buf[BUFFSIZE];
int bufp=0; //buf下标
struct key{
char *keywordlist;
int keywordnum;
}sweartab[MAX]={
"auto", 0,
"break", 0,
"double", 0,
"else", 0,
"float", 0,
"int", 0,
"long", 0,
"char", 0,
"const", 0,
"extern", 0,
"case", 0,
"for", 0,
/*etc*/
};

int getwords(char *, int); //用于读取输入流中单词的函数
int binsearch(struct key *, char *, int);
//折半查找函数,寻找sweartab中和输入词相同的元素, 返回该元素的下标
/*这里第一个参数也是指针,是struct key类型的指针*/

/*keytab中关键字的个数*/
int keysum=(sizeof (sweartab))/(sizeof (struct key));

/*函数入口*/
int main (int argc, char **argv)
{
int list, i; //list,元素下标
char word[MAX]; //储存一个单词
while (getwords(word, MAX)!='\n'){ //注意,这里的word是数组名所以有空间存储字符串
if (isalpha(*word))
list=binsearch(sweartab, word, keysum);
if (list>=0)
sweartab[list].keywordnum++;
}

for (i=0;i<keysum;i++)
printf("%s: %d\n",sweartab[i].keywordlist, sweartab[i].keywordnum);
free (buf);
return 0;
}


int getch(void)
{
return (bufp>0) ? *( buf+(--bufp) ) : getchar();
/*如果buf不是空的,就返回栈顶下面的那层,如果是空的,就接受一个键盘输入*/
}

void ungetch (char c)
{
if (bufp>BUFFSIZE)
printf ("ungetch:too many char\n");
else
*(buf+(bufp++))=c; //如果buf没满,就将函数参数存储进buf
}

/*读取输入的一个单词*/
int getwords(char *word, int lim)
{ //参数:数组的地址,数组长度的上限
int c, i=0;
char *last=word; //指向数组各个元素的指针
while (isspace(c=getch()))
; //跳过空白输出
if (c!= '\n') //第一个非空白输出
*last++=c; //这里将输入的非空白字符送给了当前指针位置并将指针后移了一位
if (!isalpha(c)){ //如果c不是字母
*last='\0'; //结束字符串
return c; //返回c即返回最后接收到的输入字符
} //如果c是字母
for (; --lim>0; last++)
if (!isalnum(*last=getch())){ //isalnum(int), 判断是否是数字、大小写字母,相当于isalpha(int)||isdigit(int), 当真时返回非零,否则返回0
//取下一个输入的字符,若不是字母或数字那么将该字符放入缓冲区并跳出循环
ungetch(*last); //每次用getch获得一个字符存入word数组判断是不是字母数字,不是则放回缓冲区,并退出循环
break;
}
*last = '\0'; //用0结束字符串
return *word; //返回该单词的首字母
}

/*折半查找函数, 参数:结构字符地址,目标字符串地址,结构数组元素个数,
返回和结构字符串列标相同的结构数组下标*/
int binsearch (struct key *tab, char *s, int len)
{
int bot, top, mid, flag;
bot=0;
top=len-1;
mid=(bot+top)/2;
while (bot<=top){
flag=strcmp((tab+mid)->keywordlist, s); //比较列表中字符串和word字符串
if (flag>0){ //tab[mid]>s, 目标字符串在中间上面
top=mid-1;
}
else if (flag<0)
bot=mid+1;
else
return mid;
}
return -1;
}
...全文
318 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Adzuki2018 2019-03-12
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
折半查找需要 查找序列 有序
你的tab无序 不能用折半查找

折半逻辑也不对
整个循环 没看见你的折半操作

buf 不是 malloc等内存分配函数 获取的内存
不能free

先谢谢大侠费时间帮助小弟。
free那串确实有问题。我改正一下。
tab里的字符串按字典顺序排列,用strcmp确定先后顺序,为啥不能用折半呢?
还有top=mid-1和bot=mid+1不是折半操作吗?
麻烦大侠解惑!
lin5161678 2019-01-25
  • 打赏
  • 举报
回复
折半查找需要 查找序列 有序
你的tab无序 不能用折半查找

折半逻辑也不对
整个循环 没看见你的折半操作

buf 不是 malloc等内存分配函数 获取的内存
不能free

Adzuki2018 2019-01-25
  • 打赏
  • 举报
回复
。。。。。。。。。。。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧