• while循环中使用scanf函数


    妈的,这scanf函数学了快10年了,怎么还会出现莫名其妙的问题?看下面的代码(VS2012环境下运行):

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    int main()
    {
        char root_value = '';
        int i =1;
        while (i!=5)
        {
            printf("输入:");
            scanf("%c",&root_value);//用户输入节点
            i++;
        }
        
        printf("输入:%c
    ",root_value);
    }

    本意是每次循环读取一个字符,结果在VS2012里面运行,运行结果莫名其妙:第一次循环输入字符a,然后回车,进行下一次输入,结果屏幕直接输出两个“输入:输入:“。原来scanf把回车也当作一个字符读入了。

    原因是因为scanf()函数会把回车、空格、Tab或一些非法输入的字符当作此次输入的结束标志,它不会把这些字符输入到想要保存此次输入数据的变量中,而是把这些字符遗留在了输入缓冲区,那么,当下一次想要从标准输入中读取一个字符时,这个遗留的字符就正好充当了此次的输入字符。
    显而易见,程序在输入abcdefg之后,输入了回车来结束此次输入,那么回车就遗留在了输入缓冲区,当需要给c输入字符时,它自动的充当了输入的字符,因此,程序没有给我们输入c的字符的机会。(通过输出abcdefg之后又两个空行(残留在输入缓冲区和输出的两个回车导致的)也可以验证)

    C语言为了解决这种问题,为我们提供了一种很方便的清空输入缓冲区的方式—->>fflush()函数,它会把残留在输入缓冲区里的所有数据清空

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    int main()
    {
        char root_value = '';
        int i =1;
        while (i!=5)
        {
            printf("输入:");
            scanf("%c",&root_value);//用户输入节点
            fflush(stdin);
            i++;
        }
        
        printf("输入:%c
    ",root_value);
    }
  • 相关阅读:
    PHP unicode与普通字符串的相互转化
    PHP 日期之间所有日期
    PHP Excel导入日期单元格处理
    JS base64文件转化blob文件
    Mvc 刷新PartialView
    WebGL绘制变幻光斑
    WebGL笔记(四):初步封装
    WebGL笔记(目录)
    [JavaScript/canvas] 创建基于坐标访问的图形数据对象
    WebGL笔记(五):封装顶点和颜色等数组数据(二)
  • 原文地址:https://www.cnblogs.com/VIPler/p/6906434.html
Copyright © 2020-2023  润新知