继续问linux下c问题
16lz
2021-01-22
#include<stdio.h>
#include<malloc.h>
#defineMAXSIZE1024
typedefchardatatype;
typedefstructnode
{
datatypedata;
structnode*lchild,*rchild;
}bitree;
bitree*CREATE()
{
bitree*Q[MAXSIZE];
bitree*root,*s;
datatypech;
intfront,rear;
front=1;
rear=0;
root=NULL;
while((ch=getchar())!='#')//输入'#'结束二叉树建立
{
s=NULL;
if(ch!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
{
root=s;
}
else
{
if(Q[front]&&s)
{
if(rear%2==0)
{
Q[front]->lchild=s;
}
else
Q[front]->rchild=s;
}
if(rear%2==1)
front++;
}
}
returnroot;
}
intmain(void)
{
bitree*root;
root=CREATE();
}
linux下运行程序,输入abc#
结果得到的二叉树并不是a
bc
b结点没有了,
进入单步调试
在第1个getchar那里
step
输入a,回车
没有问题,得到结点
循环回到getchar,step或者直接输入b直接就跳过getchar,结点也没有建立,为什么呢?怎么解决这个问题?
因为输入了一个字符后,没有清空缓冲区。里面还含有回车符或者空格符,当下一次进去的时候,getchar就是刚才的符号,所以不会再次接受字符。应该刷新一次。如果在VC下用fflush(stdin);
#include<malloc.h>
#defineMAXSIZE1024
typedefchardatatype;
typedefstructnode
{
datatypedata;
structnode*lchild,*rchild;
}bitree;
bitree*CREATE()
{
bitree*Q[MAXSIZE];
bitree*root,*s;
datatypech;
intfront,rear;
front=1;
rear=0;
root=NULL;
while((ch=getchar())!='#')//输入'#'结束二叉树建立
{
s=NULL;
if(ch!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
{
root=s;
}
else
{
if(Q[front]&&s)
{
if(rear%2==0)
{
Q[front]->lchild=s;
}
else
Q[front]->rchild=s;
}
if(rear%2==1)
front++;
}
}
returnroot;
}
intmain(void)
{
bitree*root;
root=CREATE();
}
linux下运行程序,输入abc#
结果得到的二叉树并不是a
bc
b结点没有了,
进入单步调试
在第1个getchar那里
step
输入a,回车
没有问题,得到结点
循环回到getchar,step或者直接输入b直接就跳过getchar,结点也没有建立,为什么呢?怎么解决这个问题?
5 个解决方案
#1
因为输入了一个字符后,没有清空缓冲区。里面还含有回车符或者空格符,当下一次进去的时候,getchar就是刚才的符号,所以不会再次接受字符。应该刷新一次。如果在VC下用fflush(stdin);
......
if(rear%2==1)
front++;
}
fflush(stdin);
}
returnroot;
}