zoukankan      html  css  js  c++  java
  • 连续调用scanf的问题总结

        对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下:

    1、多个scanf之后,后序以 scanf("%c",&c)

        当程序连续调用scanf 函数的,前面的获得输入接收的时候,一般结束都是以一个空白字符(空格、enter),比如enter 结束输入;但是,当后面接着是还有一个以 scanf("%c",&a) 的时候,则上面输出 enter 作为结束符,就会被输入到a,从而导致了a 为空。

    (1)以%d 继续输入的时候:

    <PRE>int main(void)
    {
        int a, b, c = 0;
        printf("input a,b
    ");
        scanf("%d,%d", &amp;a,&amp;b);
        printf("input c
    ");
        scanf("%d", &amp;c);
        printf("a = %d, b = %d, c = %d
    ", a, b, c);
        while (1);
    }
    input a,b
    1,2
    input c
    3
    a = 1, b = 2, c = 3</PRE>
    
    

    (2)以%c继续输入的时候:

    int main(void)
    {
        int a, b, c = 0;
        scanf("%d,%d", &a,&b);
        scanf("%c", &c);
        printf("a = %d, b = %d, c = %c
    ", a, b, c);
        while (1);
    }

        结果:

    input a,b
    1,2
    a = 1, b = 2, c =

    结果很神奇,当输入1,2 结束输入:enter之后,就直接是打印出了结果,c压根就没有手动输入就被打印了出来。

    原因解释:

        输入a,b 值的时候,输入的是: 1,2 enter 。当所以输入的数据里面就有了三个数据,也就是: 1 2 enter,三个数据。当全部都是以 %d 格式作为输入,1赋值给a,2赋值给b,但是enter 很显然不是 %c 格式的,就被 pass 掉,只有当输入的是数字的时候,并将输入的数值3 赋值给 c。

        当是以: %d,%d,%c 连续输入的时候,我们知道,输入的是1,2 enter,1赋值a,2赋值给b,而此时,%c,要求的是输入一个字符,就会把 enter 赋值给 c,所以这就造成了 c 打印的结果为空。

    scanf 的工作原理:

       scanf 的工作原理是将用户的任何输入保存到缓冲区之中,当存在 scanf 的时候,则从缓冲区的队列中读取数据,直到遇见空白字符(空格、enter、tab、换页符)的时候又或者不是本次输入指定类型的时候,就结束这一次的输入。所以,当连续输入为 %d、%f、%x 等数据格式,则可以自动跳过空白字符,因为类型不匹配嘛,直到出现数字位为止;

    解决的办法:

    (1)通过判断是否输入的为 enter

    int main(int argc, char *argv[])
    {
        int a, b, c = 0;
        scanf("%d,%d", &a, &b);
        do 
        {
            scanf("%c", &ac);
        } while (c == '
    ');
        
        printf("a = %d, b = %d, c = %c
    ", a, b, c);
        while (1);
    }

        添加了 do while 循环,获得输入为真,也就是获得的输入为enter 或者其他的空白的字符的话,则循环输入,当输入的是要求的数据类型(%c)的时候,就退出循环体,保证可以获得c值。

    (2)输入添加空白字符(空格)


    <PRE>int main(int argc, char *argv[])
    {
        int a, b, c = 0;
        scanf("%d,%d", &a, &b);
    
        scanf(" %c", &c);   // %c 前面添加了空格,也就是前面是允许出现空格(enter)
        
        printf("a = %d, b = %d, c = %c
    ", a, b, c);
        while (1);
    }</PRE>

        其实就是scanf(" %c",&c),多添加了一个空格,。空格%c: 指定了输入的内容是: 空格+%c 的模式。

    2、连续多个字符的输入

        当需要连续输入多个字符的时候:

    <PRE>int main(int argc, char *argv[])
    {
        char a, b;
        scanf("%c", &amp;a);
        scanf("%c",&amp;b);
        printf("a = %c, b = %c
    ", a, b);
        while (1);
    }</PRE>

    结果为:

    a
    a = a, b =

        还是会把 enter 赋值给b,

    解决的办法:

    (1)添加空格
    <PRE>int main(int argc, char *argv[])
    {
        char a, b;
        scanf("%c", &a);
        scanf(" %c",&b);
        printf("a = %c, b = %c
    ", a, b);
        while (1);
    }

    结果输入:

    a
    b
    a = a, b = b

        原因不做解释,上面已经做好了解释。

    (2)添加 do while 去判断
    <PRE>int main(int argc, char *argv[])
    {
        char a, b;
        scanf("%c", &a);
        do 
        {
            scanf("%c", &b);
        } while (  b == '
    ');
        printf("a = %c, b = %c
    ", a, b);
        while (1);
    }
  • 相关阅读:
    不相交集实现实例
    TQ2440开发板挂载U盘出现乱码
    快速选择实例
    linux2.6.30.4内核移植(7)——插入hello world驱动模块
    linux2.6.30.4内核移植(6)——移植应用程序hello world常见的错误:-bin/sh ./hello not found
    linux2.6.30.4内核移植(5)——构建根文件系统(yaffs文件系统格式的镜像)
    linux2.6.30.4内核移植(4)——完善串口驱动
    linux2.6.30.4内核移植(3)——yaffs文件系统移植
    linux2.6.30.4内核移植(2)——Nand Flash驱动移植
    快速排序实例
  • 原文地址:https://www.cnblogs.com/qxj511/p/5218279.html
Copyright © 2011-2022 走看看