关于getch 与 ungetch

dfatfat 2010-11-14 12:51:25
int getword(char *word ,int lim)
{
int c;
char *w=word;
while(isspace(c=getch()))
;
if(c!=EOF)
*w++=c;
if(!isalpha(c)){
*w='\0';
return c;
}
for(;lim>0;*w++)
if(!isalnum(*w=getch())){
ungetch(*w);
break;
}
*w='\0';
return word[0];
}
这个函数 用到了 getch 与ungetch
int getch(void)
{
return (bufp>0?buf[--bufp]: getchar());
}
void ungetch (int c)
{
if(bufp>=BUFSIZE)
printf("ungetch:too many characters\n");
else
buf[bufp++] =c;
}

这两个 函数是如何用作的呢?
假如我在getword里输入了一个字符c然后 getch先检查buf【】 里有没有字符如果没有就getchar
可是如何输入下一个字符b是由于buf【】里已经有一个字符c了那么返回的就是 c了而不是 b???
球高人指教 100分
...全文
365 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiruirui0507 2010-11-14
  • 打赏
  • 举报
回复
int getword(char *word ,int lim)
{
int c;
char *w=word;
//忽略空格
while(isspace(c=getch()))
;
//如果接受的字符不是结束标志
if(c!=EOF)
*w++=c;
//如果首字符不是字母设置结束标志返回
if(!isalpha(c)){
*w='\0';
return c;
}


for(;lim>0;*w++)
//如果接受的是字母或数字继续,如果不是取回存在缓冲区里的字符直到缓冲区为零
if(!isalnum(*w=getch())){
//已经读入了一个非字母或数字要把它放入缓冲区
ungetch(*w);
break;
}
*w='\0';
return word[0];
}

//如果缓冲区有字符取缓冲区,如果没有接受键盘
int getch(void)
{
return (bufp>0?buf[--bufp]: getchar());
}
//缓冲区里面加入一个字符
void ungetch (int c)
{
if(bufp>=BUFSIZE)
printf("ungetch:too many characters\n");
else
buf[bufp++] =c;
}
小小攻城师 2010-11-14
  • 打赏
  • 举报
回复
假如我在getword里输入了一个字符c然后 getch先检查buf【】 里有没有字符如果没有就getchar
可是如何输入下一个字符b是由于buf【】里已经有一个字符c了那么返回的就是 c了而不是 b???

我不知道我解释清楚了没有。
你输入一个c,他是不会放入缓冲区的if(!isalnum(*w=getch()))
这一句限制只有非数字字母才会放入缓冲区,这个假设不成立。
另外你的意思是他会处理上一次的字符不是这次输入的,这个也不会
应为程序前面会判断while(isspace(c=getch()))这句忽略空格
if(!isalpha(c)) 这句判断单词第一个字符必须是字母如果不是的话就返回
所以程序可以很正常的运行。我只能解释成这个样子如果你还不理解只能说明我语言表达不行。
对不住。
小小攻城师 2010-11-14
  • 打赏
  • 举报
回复
按照这个程序的想法,程序无法判断一个程序是否已经输入结束,他只有接受输入之后才能验证,比如这个程序循环验证输入字母或者数字的时候,他只有接受输入之后才能判断接受的是否是字母或者数字,当它接受一个非数字字母时,他已经多接受了一个非字母数字的值所以要把他放入缓冲区。这样就不会造成那个你刚才输入的非字母或者数字凭空消失了。
小小攻城师 2010-11-14
  • 打赏
  • 举报
回复
int getword(char *word ,int lim)
{
int c;
char *w=word;
//忽略空格
while(isspace(c=getch()))
;
//如果接受的字符不是结束标志
if(c!=EOF)
*w++=c;
//如果首字符不是字母设置结束标志返回
if(!isalpha(c)){
*w='\0';
return c;
}


for(;lim>0;*w++)
//如果接受的是字母或数字继续,如果不是取回存在缓冲区里的字符直到缓冲区为零
if(!isalnum(*w=getch())){
//已经读入了一个非字母或数字要把它放入缓冲区
ungetch(*w);
break;
}
*w='\0';
return word[0];
}

//如果缓冲区有字符取缓冲区,如果没有接受键盘
int getch(void)
{
return (bufp>0?buf[--bufp]: getchar());
}
//缓冲区里面加入一个字符
void ungetch (int c)
{
if(bufp>=BUFSIZE)
printf("ungetch:too many characters\n");
else
buf[bufp++] =c;
}
dfatfat 2010-11-14
  • 打赏
  • 举报
回复
不对是用中文解释一下求高手
dfatfat 2010-11-14
  • 打赏
  • 举报
回复
e文 不好 有没有高人用英文解释一下 100分全给
newfinder 2010-11-14
  • 打赏
  • 举报
回复
MSDN Library上有讲解的.

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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