K&R6-3节例题返回内存错误,请大佬帮忙看看bug在哪?
代码如下,控制台窗口返回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;
}
...全文
相关推荐
金蝶K3错误代码查询
金蝶K3错误代码查询与解析金蝶K3是一款广泛应用于企业财务管理和供应链管理的软件,其在运行过程中可能会遇到各种错误,这些错误通常由特定的错误代码表示。
FluidSIM 3.6安装教程,注册机
本文分享了FluidSIM 3.6的安装及注册机使用教程。先介绍了准备文件的下载与解压,接着说明序列号的获取与输入,再阐述注册码的获取,需先使用错误注册码,重启后获取真正注册码完成注册,最后还探究了获取真正注册码的原理。
一篇文章带你上手K6
K6是一个基于JavaScript的开源负载测试工具,用于Web应用、API和微服务的性能测试。它支持自定义脚本,模拟多种负载场景,提供丰富的测试报告和分析。K6包括HTTP请求、metrics、thresholds等功能,适用于负载、压力和浸泡测试。用户可以利用其社区资源和灵活性进行各种性能测试。
华硕H81M-K 不过内存
BIOS Bug:某些BIOS可能存在未发现的错误,影响内存的正确识别和工作。为了解决“不过内存”的问题,用户可以采取以下步骤:1.
Bug2k
**安全风险**:如果"Bug2k"是一个已知的安全问题,那么了解它的危害程度和受影响的系统范围至关重要。用户可能需要尽快修补以防止潜在的攻击。3.


新手乐园
