一、问题描述
使用**#号法递归生成二叉树**时遇到一个scanf自动读取缓存中\n 的问题,导致程序无法按照设想的状态执行。
产生错误的代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BINARYNODE {
char ch;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
void Create_Recursion_DLR(BinaryNode* root)
{
if (root == NULL)
return;
printf("%c", root->ch);
Create_Recursion_DLR(root->lchild);
Create_Recursion_DLR(root->rchild);
}
BinaryNode* CreateBinaryTree()
{
fflush(stdin);
char c;
scanf("%c", &c);
BinaryNode* node = NULL;
if (c == '#' )
{
node = NULL;
}
else
{
node = (BinaryNode*)malloc(sizeof(BinaryNode));
node->ch = c;
node->lchild = CreateBinaryTree();
node->rchild = CreateBinaryTree();
}
return node;
}
BinaryNode* BinaryTreeCreate(char* arr, int* idx)
{
if (arr[*idx] == '#')
{
(*idx)++;
return NULL;
}
BinaryNode* root = (BinaryNode*)malloc(sizeof(BinaryNode));
root->ch = arr[*idx];
(*idx)++;
root->lchild = BinaryTreeCreate(arr, idx);
root->rchild = BinaryTreeCreate(arr, idx);
return root;
}
void main()
{
char arr[] = "AB#C##E#F##";
int idx = 0;
BinaryNode * root = CreateBinaryTree();
Create_Recursion_DLR(root);
printf("\n");
system("pause");
}
二、错误原因
循环体中第二个scanf函数自动读入’\n’。产生的主要原因是 fflush(stdin); 未生效.貌似新版本gcc中这个语句都无效了。 可以用上面例子debug验证。
三、解决办法
-
将 scanf 用 gets替换解决。 gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符
不属于这个字符串。
-
在scanf后加如如下代码
char clear[1000];
fgets(clear, 1000, stdin);
|