IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C——循环体中第二个scanf函数自动读入‘ |n‘问题 -> 正文阅读

[C++知识库]C——循环体中第二个scanf函数自动读入‘ |n‘问题

一、问题描述

使用**#号法递归生成二叉树**时遇到一个scanf自动读取缓存中\n的问题,导致程序无法按照设想的状态执行。

产生错误的代码如下:

//#号法前序创建二叉树
//test tree:
// AB#C##E#F##
//  AB#CD##E#F##
//       A
//  B           E
//#      C   #     F
// 
//    D          #   #   
//  #    #    
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//Binary Tree node  二叉树结点
typedef struct BINARYNODE {
    char ch;                    //结点值
    struct  BINARYNODE* lchild;//左子树
    struct  BINARYNODE* rchild;//右子树
}BinaryNode;

//Preorder traversal        //前序
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);	//会在下一次递归时自动读入\n
    //char clear[1000];               //起到清除缓存作用
    //fgets(clear, 1000, stdin);      //起到清除缓存作用
    //gets(&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;//为空返回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##";
    //char arr[] = "A##";

    int idx = 0;
    BinaryNode * root = CreateBinaryTree();
    Create_Recursion_DLR(root);
    //BinaryNode* root1 = BinaryTreeCreate(arr, &idx);
    //Create_Recursion_DLR(root1);
    printf("\n");

    system("pause");
}

二、错误原因

循环体中第二个scanf函数自动读入’\n’。产生的主要原因是 fflush(stdin);未生效.貌似新版本gcc中这个语句都无效了。
可以用上面例子debug验证。

三、解决办法

  1. 将 scanf 用 gets替换解决。

    gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符
    不属于这个字符串。
    
    
    
  2. 在scanf后加如如下代码

    //可以将缓存中的\n读走,保证递归时不误读\n
    char clear[1000];
    fgets(clear, 1000, stdin);
    
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:20:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:54:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码