首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个c程序有关问题,ch=getchar();老是被直接跳过!

2012-09-11 
一个c程序问题,chgetchar()老是被直接跳过!!有一个创建二叉树的程序:#include stdio.h#include stdli

一个c程序问题,ch=getchar();老是被直接跳过!!
有一个创建二叉树的程序:
#include "stdio.h"
#include "stdlib.h"
 
//*********************************************************************
//定义二叉树的结构
typedef struct tree{
  unsigned char data;
  struct tree *lchild;
  struct tree *rchild;
}*Ptree,Dtree;
 
//*********************************************************************
//先序创建二叉树
Ptree createTree()
{
  unsigned char ch;
  Ptree t;
  ch=getchar();
  if(ch=='#')
  t=NULL;
  else
  {
  t=(Ptree)malloc(sizeof(Dtree));
  t->data=ch;
  t->lchild=createTree();
  t->rchild=createTree();
  }
  return t;
}

void main(void)
{
createTree();
}

第一次就输入‘#’时,程序运行良好,正常退出,可是如果第一次不输入‘#’时,程序接下来就出问题了,我用gdb进行了调试,发现ch=getchar()这一行总是每递归两次就跳过执行一次,而去直接检测ch,而不是等待输入ch!!
这是为什么?

[解决办法]
用非缓冲函数getch代替缓冲函数getchar试试看。
[解决办法]

探讨

每次输入后缓冲区会遗留回车符'\n',执行getchar前先清空缓冲区
fflush(stdin);

[解决办法]
getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(/n)而结束的,这个/n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符/n,这样第二次的读入函数直接从缓冲区中把/n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!
[解决办法]
#include<stdio.h>
int main()
{
int i;
char ch;
scanf("%d",&i);
/****************最好的方法*******************/
//scanf(" %c",&ch);
/****************次笨的方法*******************/
//scanf("\n");
/****************最笨的方法*****************/
// getchar();
/****************次次笨的方法*******************/
//while((getchar())!='\n')
//continue;

ch=getchar();
printf("%d\t%c\n",i,ch);
return 0;
}
//为了避免下一次的ch=getchar()直接读取\n而结束,保证每次都等待键盘输入……
或者fflush(stdin);

热点排行