读书人

一个c程序有关问题ch=getchar();老是

发布时间: 2012-09-11 10:49:03 作者: rapoo

一个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);

读书人网 >C语言

热点推荐