输入与实际不符,将|\n录入了数组第一位


#include
#include
#include
#define MaxSize 100
typedef char DataType;
typedef struct
{
    DataType data[MaxSize];
    int biTreeNum;
} SeqBiTree;
SeqBiTree *CreateBiTree(SeqBiTree *tree,int n)
{
    tree->biTreeNum = n;
    if (n == 0) return NULL;
    int i = 1;
    int p = i;
    while (i <= n)
    {
        scanf_s("%c", &(tree->data[p - 1]));
        if (tree->data[p - 1] != '#')
        {
            i++;
            p++;
        }
        else
            p++;
    }
    return tree;
}
void PrePrint(DataType Seq[],int num)
{
    if (Seq[num - 1] != '#')
        printf("%c ", Seq[num - 1]);
    else return;
    PrePrint(&(Seq[2*num-1]),2*num);
    PrePrint(&(Seq[2*num+1-1]),2*num+1);
}
void PreOrder(SeqBiTree* tree)
{
    if (tree->biTreeNum == 0)
    {
        printf("二叉树为空,先序遍历结束\n");
        return;
    }
    int i = 1;
    PrePrint(&(tree->data[i-1]),i);
    printf("\n");
}
void InPrint(DataType Seq[], int num)
{
    if (Seq[2*num - 1] != '#')
        printf("%c ", Seq[2*num - 1]);
    else return;
    InPrint(&(Seq[num-1]),num);
    InPrint(&(Seq[2*num+1-1]), 2*num+1);
}
void InOrder(SeqBiTree* tree)
{
    if (tree->biTreeNum == 0)
    {
        printf("二叉树为空,中序遍历结束\n");
        return;
    }
    int i = 1;
    InPrint(&(tree->data[i-1]), i);
    printf("\n");
}
void PostPrint(DataType Seq[], int num)
{
    if (Seq[2 * num - 1] != '#')
        printf("%c ", Seq[2 * num - 1]);
    else return;
    PostPrint(&(Seq[2 * num + 1 - 1]), 2 * num + 1);
    PostPrint(&(Seq[num - 1]), num);
}
void PostOrder(SeqBiTree* tree)
{
    if (tree->biTreeNum == 0)
    {
        printf("二叉树为空,后序遍历结束\n");
        return;
    }
    int i = 1;
    PostPrint(&(tree->data[i - 1]), i);
    printf("\n");
}
void LevelOrder(SeqBiTree* tree)
{
    if (tree->biTreeNum == 0) { printf("层序遍历为空,返回\n"); return; }
    int i = 1;
    int p = i;
    while (i <= tree->biTreeNum)
    {
        if (tree->data[p - 1] != '#')

        {
            printf("%c ", tree->data[p - 1]);
            i++; p++;
        }
        else p++;
    }
    printf("\n");
}
int main()
{
    int NUM;
    printf("输入将要创建的二叉树的结点数:\n");
    scanf_s("%d", &NUM);
    printf("按照层序遍历的顺序建立结点数为%d的二叉树\n",NUM);
    SeqBiTree* T = (SeqBiTree*)malloc(sizeof(SeqBiTree));
    T = CreateBiTree(T, NUM);
    printf("先序遍历创建的二叉树\n");
    PreOrder(T);
    printf("中序遍历创建的二叉树\n");
    InOrder(T);
    printf("后序遍历创建的二叉树\n");
    PostOrder(T);
    printf("层序遍历建立的二叉树\n");
    LevelOrder(T);
    printf("\n");
    printf("若创建一个空的二叉树并依次进行遍历结果如下:\n");
    SeqBiTree* N = (SeqBiTree*)malloc(sizeof(SeqBiTree));
    N = CreateBiTree(N, 0);
    PreOrder(N);
    InOrder(N);
    PostOrder(N);
    LevelOrder(N);


    return 0;
}

问题出在创建二叉树函数里,输入见下:

img


但是发现了问题,见下:

img


希望能得到解决。谢谢

你输入4的时候,还按了个回车,4被读取,回车,也是换行'\n'还残留在缓冲区。scanf %c 的时候就会把'\n'读取了。所以在之前要清一下缓冲区,不是很复杂的话用一次getchar()或者scanf %c应该就行了,把换行符吞掉