连续调用scanf的问题总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连续调用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\n");
    scanf("%d,%d", &amp;a,&amp;b);
    printf("input c\n");
    scanf("%d", &amp;c);
    printf("a = %d, b = %d, c = %d\n", 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\n", 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 == \n);
    
    printf("a = %d, b = %d, c = %c\n", 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\n", 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\n", 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\n", 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 == \n);
    printf("a = %c, b = %c\n", a, b);
    while (1);
}

以上是关于连续调用scanf的问题总结的主要内容,如果未能解决你的问题,请参考以下文章

如何优化C ++代码的以下片段 - 卷中的零交叉

BootStrap有用代码片段(持续总结)

为什么连续的scanf会被跳过或不执行

为什么连续的scanf会被跳过或不执行

小程序连续点击bug解决

BootStrap实用代码片段(持续总结)