鱼C论坛

 找回密码
 立即注册
查看: 1151|回复: 10

[已解决]求教scanf命令相关问题

[复制链接]
发表于 2020-12-31 10:45:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
       代码如下
         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);

}
最佳答案
2020-12-31 15:31:36
我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。你的123456是在缓冲区的,从缓冲区读取了1234,,56留在了缓冲区,所以会继续读取56嗯,应该是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 11:22:14 From FishC Mobile | 显示全部楼层
scanf最好不要用宽度限制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 11:27:02 | 显示全部楼层
wp231957 发表于 2020-12-31 11:22
scanf最好不要用宽度限制

好吧,我只是学习过程中试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 15:31:36 | 显示全部楼层    本楼为最佳答案   
我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。你的123456是在缓冲区的,从缓冲区读取了1234,,56留在了缓冲区,所以会继续读取56嗯,应该是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-2 23:27:40 | 显示全部楼层
  scanf("%4d",&a);不是把数据直接存进a里,而是先存进缓存区,用取址符,把四位数存进a里,假如你输入了五位,值取了四位,就剩下一位,假如下次再数四位时就会把之前的数据输入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-4 09:37:07 | 显示全部楼层
一世轻尘 发表于 2020-12-31 15:31
我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后 ...

明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-4 09:37:39 | 显示全部楼层
sunrise085 发表于 2020-12-31 15:39
scanf一般不控制位宽。
但不是不能控制位宽,控制位宽的时候,从缓冲区读取相应的字符,剩余字符会留在缓 ...

明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-4 09:38:18 | 显示全部楼层
te___amo 发表于 2020-12-31 23:49
调用scanf函数时,scanf会先到缓冲区里找数据 如果缓冲区没数据,scanf函数就会等待用户输入数据 。 你代码 ...

明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-4 09:51:30 | 显示全部楼层

Lz看看哪个回答你感觉更好,给个最佳答案吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 07:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表