我有循环结构数组的函数。它在该结构中输入元素。我的功能如下:
void inputSubject(subject *subject ){
int i;
for(i = 0; i < 10; i++){
printf("\n[%d] ", i+1);
printf("Enter Subject Code: ");
scanf("%s", subject[i].subjectCode);
printf(" Enter Units: ");
// scanf("%f", &subject[i].units);
while(scanf("%f", &subject[i].units)!=1){
printf("Invalid input. Re-enter units again: \n");
scanf("%f", &subject[i].units);
}
printf(" Enter grade for subject: ");
scanf("%f", &subject[i].grade);
}
}
您可能会注意到有评论。在注释代码之后应该检查输入单元是否是浮点数。如果不是,则必须要求用户重新输入该单元。
但它并没有像我预期的那样工作。如果它看到输入不是浮点数,它就不会提示用户输入的内容不是浮点数,也不需要用户重新输入可接受的值。相反,它会产生printf
应该为等级做同样的事。
答案 0 :(得分:1)
标准输入被缓冲。作为输入给出的任何内容都首先放在函数所从的缓冲区中。
例如,当您将3.14
作为输入时,它首先被放置在scanf("%f")
读取它的缓冲区中。
当您提供非浮动值时,scanf()
没有找到预期的%f
。因此它将输入留在输入缓冲区本身,并且执行该程序的下一个语句,恰好是期望scanf()
的另一个%f
。前一个scanf()
未使用的输入仍在输入缓冲区中,这是下一个scanf()
使用的输入。同样,该值未被消耗。
你要做的是在每次读取失败后以某种方式消耗输入缓冲区中的非浮点值。
您可以执行类似
的操作int ch;
while( (ch=getchar())!='\n' && ch!=EOF );
从输入缓冲区消耗到换行符。当用户按下Enter键时,将给出换行符。
scanf()
返回成功分配值的变量数。在这种情况下,此值应为1
,以便成功阅读。
char ch;
while(scanf("%f", &subject[i].units)!=1){
printf("Invalid input. Re-enter units again: \n");
while( (ch=getchar())!='\n' && ch!=EOF );
}
您可以取消第二个scanf()
。
答案 1 :(得分:-2)
包含math.h头文件,如果你想要单位的整数值
,请这样做scanf("%f",&a);
while(a-floor(a)!=0){
printf("please enter a integer value");
scanf("%f",&a);
}