MeowMoo 发表于 2020-12-31 10:45:11

求教scanf命令相关问题

       代码如下
       printf("input a numbers(6位数):\n");
        scanf("%4d",&a);
        printf("%d\n",a);

        printf("input a numbers(6位数):\n");
        scanf("%3d%3d",&a,&b);
        printf("%d %d\n",a,b);

        我第一次输入123456,打印1234.
        第二次输入654321,为何打印56,6543?是把上次输入省去的值放到下次的赋值了,为什么会这样?
        我刚开始以为是变量重复的问题,后来我重新定义了两个变量d,e结果一样。
        求教求教,下面是第二次完整代码
#include <stdio.h>
void main()
{
        int a,b,d,e,n;
        char c;
        printf("input a character:\n");
        c=getchar();
        putchar(c);
        printf("\n");

        printf("input 3 numbers:\n");
        scanf("%d %*d %d",&a,&b,&n);
        printf("%d %d %d",a,b,n);
        printf("\n");//这两个是其他练习,不用管它//

        printf("input a numbers(6位数):\n");
        scanf("%4d",&a);
        printf("%d\n",a);

        printf("input a numbers(6位数):\n");
        scanf("%3d%3d",&d,&e);
        printf("%d %d\n",d,e);

}

wp231957 发表于 2020-12-31 11:22:14

scanf最好不要用宽度限制

MeowMoo 发表于 2020-12-31 11:27:02

wp231957 发表于 2020-12-31 11:22
scanf最好不要用宽度限制

好吧,我只是学习过程中试一下

一世轻尘 发表于 2020-12-31 15:31:36

我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。你的123456是在缓冲区的,从缓冲区读取了1234,,56留在了缓冲区,所以会继续读取56{:10_312:}嗯,应该是这样

sunrise085 发表于 2020-12-31 15:39:48

scanf一般不控制位宽。
但不是不能控制位宽,控制位宽的时候,从缓冲区读取相应的字符,剩余字符会留在缓冲区,而不会被清除掉,在下一次在需要读取缓冲区的时候,会依次读取剩下的内容

比如你的程序:
第一次遇到scanf,会等待你输入。你输入的内容是:123456(回车)
而scanf控制位宽,最多只读4位,所以会读取1234并赋值给a,然后printf会打印1234
此时缓冲区还剩余:56(回车)
第二次遇到scanf,需要读取两个int类型数据,此时缓冲区还有内容:56(回车),这是会读取56,赋值给d,为什么没有读够3位呢,是因为遇到了非数字字符(回车);此时还需要在读一个3位的int数据,于是等待你输入,这时候你输入了654321(回车)。会从缓冲区读取654并赋值给e。printf打印出来的是:56 654   不会打印56 6543

te___amo 发表于 2020-12-31 23:49:50

调用scanf函数时,scanf会先到缓冲区里找数据 如果缓冲区没数据,scanf函数就会等待用户输入数据 。 你代码中的第一次调用scanf函数 因为你设置了读取宽度所以scanf只读取了 1 2 3 4   所以输入的5 6就被 遗留在了缓冲区里    第二次调用scanf函数 如果读取类型一致5 6就会被读取出去   解决方案在第二次调用scanf上面写scanf("%*[^\n]");scanf("%*c");

无凉之心 发表于 2021-1-2 23:27:40

scanf("%4d",&a);不是把数据直接存进a里,而是先存进缓存区,用取址符,把四位数存进a里,假如你输入了五位,值取了四位,就剩下一位,假如下次再数四位时就会把之前的数据输入。

MeowMoo 发表于 2021-1-4 09:37:07

一世轻尘 发表于 2020-12-31 15:31
我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后 ...

明白了,谢谢{:5_109:}

MeowMoo 发表于 2021-1-4 09:37:39

sunrise085 发表于 2020-12-31 15:39
scanf一般不控制位宽。
但不是不能控制位宽,控制位宽的时候,从缓冲区读取相应的字符,剩余字符会留在缓 ...

明白了

MeowMoo 发表于 2021-1-4 09:38:18

te___amo 发表于 2020-12-31 23:49
调用scanf函数时,scanf会先到缓冲区里找数据 如果缓冲区没数据,scanf函数就会等待用户输入数据 。 你代码 ...

明白了,谢谢

心驰神往 发表于 2021-1-4 09:51:30

MeowMoo 发表于 2021-1-4 09:38
明白了,谢谢

Lz看看哪个回答你感觉更好,给个最佳答案吧
页: [1]
查看完整版本: 求教scanf命令相关问题