C语言,有个问题没有琢磨清楚,请大神帮忙

hncoolpy2018 2018-08-17 03:47:02
代码如下:
#include<stdio.h>

void main(void)
{

int year,month,day,num;
scanf("%*6d%4d%2d%2d",&year,&month,&day);
printf("你的生日是:%4d-%02d-%02d\n",year,month,day);

scanf("%*14d%4d",&num);
printf("%04d\n",num);

}
我想达到的目的是,在第一次输入身份证的时候,输出的是你的生日,
在第二次输入身份证的时候,输出的是后四位。
但是问题就出现在第二次输出的结果,结果输出了身份证的前四位????

我尝试把前面一段printf和scanf去掉,后一段输出是后四位,这又没有问题。

问题到底出在哪里呢?
...全文
1192 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
前面缓冲区没清干净,变成了 "后四位\n身份证18位" ,%d读数遇空白字符停止,所以%14d读了“后四位”
laoban-yu 2018-08-24
  • 打赏
  • 举报
回复
需要清理缓存区,setbuf(stdin, NULL);或者在输入前面加getchar();
J_ack01 2018-08-23
  • 打赏
  • 举报
回复
是输入的缘由吧
qq_38082615 2018-08-21
  • 打赏
  • 举报
回复
你的第二个scanf语句再看看
weixin_43025738 2018-08-21
  • 打赏
  • 举报
回复
还是输入问题吧
C學者 2018-08-21
  • 打赏
  • 举报
回复
第一个“scanf”这样样scanf("%*6%4d%2d%2d%*s",&year,&month,&day);
哈哈gogo 2018-08-20
  • 打赏
  • 举报
回复

你的第二个scanf语句再看看
赵4老师 2018-08-20
  • 打赏
  • 举报
回复
输入合法性校验的路很长,水很深。
hncoolpy2018 2018-08-20
  • 打赏
  • 举报
回复
谢谢大神的解答,我看了之后,在原代码上又增加了一个字段,弄清楚了这个问题。
#include<stdio.h>

void main(void)
{

int year,month,day,num,wrong;
scanf("%*6d%4d%2d%2d",&year,&month,&day);
printf("你的生日是:%4d-%02d-%02d\n",year,month,day);

scanf("%14d%4d",&wrong,&num);
printf("%014d,%04d\n",wrong,num);

}

这个代码很清楚了显示了错误原因。wrong的输出内容是之前一次还在缓存区内的后四位,并且在这四位数前面补的全部为0,之后才开始显示第二次SCANF的内容。
所以有两种方式解决:
1、在第一次SCANF后清除缓存;(参考一楼)
2、在第一次SCANF时就把后四位*清除。(参考三楼)
djjpaul 2018-08-20
  • 打赏
  • 举报
回复
感觉好多道道啊
I_T_Dark 2018-08-20
  • 打赏
  • 举报
回复
你的第二个scanf语句再看看
wjc958250 2018-08-20
  • 打赏
  • 举报
回复
多学习,程序后面是不是缺少了结束语,返回
流浪的农民工 2018-08-20
  • 打赏
  • 举报
回复
输入输出还真是有很多门道啊。
weixin_43018727 2018-08-20
  • 打赏
  • 举报
回复
输入合法性校验的路很长,水很深。
hofe 2018-08-19
  • 打赏
  • 举报
回复
还是输入问题吧
赵4老师 2018-08-18
  • 打赏
  • 举报
回复
输入检验够程序员吃一辈子了。
黄小猛 2018-08-18
  • 打赏
  • 举报
回复
楼上正解,原因是你输入的内容是先传送到缓存区,然后再传送给程序,比如身份证号有23位,你在第一个scanf里只接收了16位,余下的位数就会作为第二个scanf的输入。我记得c标准库里有一个函数是自动抛弃余下的位数(好像是gets_s)。
想飞的铅笔 2018-08-17
  • 打赏
  • 举报
回复
楼上正解

第一个输入的只有14位,不是一个完整的身份证号
zhangchm2018 2018-08-17
  • 打赏
  • 举报
回复
引用 3 楼 zhangchm2018 的回复:
#include<stdio.h>

void main(void)
{

int year,month,day,num[4]; // num[4]考虑末尾带X的情况
scanf("%*6d%4d%2d%2d%*4s",&year,&month,&day);
printf("你的生日是:%4d-%02d-%02d\n",year,month,day);

scanf("%*14d%4s",num);
printf("%04s\n",num);


}
第一次scanf的时候少读取了身份证后四位,导致它在第二个scanf被认为是%*14d的部分
zhangchm2018 2018-08-17
  • 打赏
  • 举报
回复
#include<stdio.h>

void main(void)
{

int year,month,day,num[4]; // num[4]考虑末尾带X的情况
scanf("%*6d%4d%2d%2d%*4s",&year,&month,&day);
printf("你的生日是:%4d-%02d-%02d\n",year,month,day);

scanf("%*14d%4s",num);
printf("%04s\n",num);


}
加载更多回复(2)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧