• 关于scanf("%c",&ch)直接跳过的问题



    有时候scanf("%c",&ch)本应该阻塞等待用户输入一个char型数据的,但为什么会跳过呢?
    例:在该程序段中,
     int year;
        printf("请输入一个年份: ");
        scanf("%d",&year);
       // setbuf(stdin,NULL);//或者直接用getchar();
        //在键盘输入一字符,显示其类型(数字、大写字母、小写字母、其他)
        char ch;
        printf("请输入一个字符: ");
        scanf("%c",&ch);
        if(ch>='1'&&ch<='9')
            printf("this is digital ");
        else if (ch>='A'&&ch<='B')
            printf("this is capital letter ");
        else if (ch>='a'&&ch<='z')
            printf("this is letter ");
        else
            printf("other! ”);
    会输出:
    请输入一个年份:
    2000
    请输入一个字符:
    other!

     
    例2:
    以下程序段:
    while (n<=0)
        {
            printf("请输入字符串长度: ");
            scanf("%d",&n);
        }
       setbuf(stdin,NULL); //<1>
        char a[n],b[n];
        printf("输入字符串: ");
        for (int i=0; i<n; i++)
        {
            scanf("%c",&a[i]);
        }
        printf("输出字符串为: ");
        for (int i=0; i<n; i++)
        {
            b[i]=a[n-1-i];
            printf("%c",b[i]);
        }
    如果将<1>语句去除,会使结果错误例:
    请输入字符串长度:
    5
    输入字符串:
    hello
    输出字符串为:
    lleh

    纠其根源,我们先来了解一下scanf()是怎么接受数据的。

    首先,当我们的pc指向scanf这句时,系统并不是等待用户输入,而是判断输入缓冲区有没有符合格式的内容,如果有,则直接读取。

    知道了这个,我就应该明白,scanf("%c",&ch);不是没有读到数据,而是读到了我们不知道的数据。

    那问题又来了,它读到了什么??

    好吧,这就要说到行缓存;

    我们用scanf()的时候都要按下enter键,那enter键按了之后去哪儿了??

    好吧,问题基本应该知道了,enter键也进入了输入缓存区,也就是scanf("%c",&ch);

    读到了' ';

    解决办法,很简单,既然缓存区有东西,那我们就清空它呗~~

    setbuf(stdin,NULL);(这个windows和linux下都可以)

    fflush(stdin);(这个只能windows);

     

  • 相关阅读:
    hadoop中使用hprof工具进行性能分析
    hadoop map端的超时参数
    一次hadoop集群机器加内存的运维过程
    算法学习-回溯法
    项目中Map端内存占用的分析
    hadoop Shuffle Error OOM错误分析和解决
    算法学习-动态规划
    项目中Map端数据处理不均匀性分析
    《Hadoop技术内幕》读书笔记——Task运行过程分析
    jsp里更新Clob类型字段数据
  • 原文地址:https://www.cnblogs.com/Alling/p/3971444.html
Copyright © 2020-2023  润新知