gpt4 book ai didi

c - 如何检查输入是否在C中 float

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:40 25 4
gpt4 key购买 nike

我有一个循环遍历结构数组的函数。它在该结构中输入元素。我的功能如下:

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);
}

}

您可能会注意到有一条评论。在注释代码应该检查输入单位是否为 float 之后。如果不是,则必须要求用户重新输入单位。

但它并没有像我预期的那样工作。如果它发现输入不是 float ,则不会提示用户输入的不是 float ,也不会要求用户重新输入可接受的值。相反,它使 printf

无限循环

应该对成绩做同样的事情。

最佳答案

标准输入被缓冲。任何作为输入给出的内容都首先放在缓冲区中,函数从那里获取它们。

例如,当您将 3.14 作为输入时,它首先被放置在 scanf("%f") 读取它的缓冲区中。

当您给出一个非浮点值时,scanf() 没有找到它期望的 %f。因此它将输入留在输入缓冲区本身中,并执行程序的下一个语句,该语句恰好是另一个期待 %fscanf()。之前的 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()

关于c - 如何检查输入是否在C中 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com