为了账号安全,请及时绑定邮箱和手机立即绑定

为什么只要5个数据而输入要打6个数据才能运行,输出又会无视第六个数据,我的代码哪里有问题?

为什么只要5个数据而输入要打6个数据才能运行,输出又会无视第六个数据,我的代码哪里有问题?

C++ C
我人晕了 2019-08-12 16:34:08
#include<stdio.h>int main(){ int i; int number[5],score[5]; printf("学号及成绩:"); for(i=0;i<5;i++) { scanf("%d,%d ",&number[i],&score[i]); } printf("符合要求:"); for(i=0;i<5;i++) {       if(score[i]>=80)       {       printf("%d,%d ",number[i],score[i]);       }} return 0;}
查看完整描述

4 回答

?
onemoo

TA贡献883条经验 获得超454个赞

问题就出在 scanf 的格式化字符串中最后的空格,也就是 scanf("%d,%d ", ...   这里第二个 %d 后面的空格。


格式化字符串中空格会匹配输入流中的任何“空白字符”。默认的空白字符包括回车、空格、tab等。如果对此不太清楚请参考我在这个帖子中的回答:https://www.imooc.com/wenda/detail/400705   (尤其是关于空白字符和 extra bonus 的部分)

对于这里的代码,你输入每组数据后必然会再敲一个回车(或空格)来结束输入,然而正是由于 scanf 的格式化字符串中最后空格的存在,这个空格会将你输入的回车“消耗”掉。而且不管你在这时敲多少个回车空格,都会被消耗掉,所以导致你的输入始终没有结束。程序在这时不显示输出结果,好似卡在这里了,实际上是程序一直在等你结束输入。

之所以你说输入第六祖才能运行,其实是因为你输入了空白字符以外的东西,这造成了匹配失败,scanf 执行结束,所以程序才继续执行下去了。那么这里其实你不用完整输入第六组数据的,只要输入任何一个非空白字符,再按回车都可以。

再深入一点,其实前五组数据输入时也面临这个问题,每组数据都是由于有后面的输入才结束本组 scanf 的执行的。

查看完整回答
反对 回复 2019-09-21
?
七友11

TA贡献1条经验 获得超0个赞

数组下标是从0开始的, number[0]   到number[5]就是6个数

输出时你的for循环是i<5   就只循环五次   

查看完整回答
反对 回复 2019-09-18
  • 4 回答
  • 0 关注
  • 968 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信