如果用户在请求用户再次尝试时输入格式错误的输入,则该代码的目的是这样的。出于某种原因,虽然在我的代码中,scanf在第一次迭代后不断被跳过,导致无限循环
#include <stdio.h>
int main() {
double A1;
int n1, loopchck, i=0;
while (i==0) {
printf("Enter a real number and inerger (A n): ");
fflush(stdin);
loopchck=scanf_s(" %lf %d", &A1, &n1);
if (loopchck == 2) {
i = 1;
}
else {
i = 0;
}
}
return 0;
}
答案 0 :(得分:0)
首先,让我们考虑一下您希望fflush(stdin);
做什么。 fflush
仅对已写入的流进行操作;它导致任何未写入(缓存)的数据被完全写入,并且在stdin
的上下文中没有任何意义。
这是一个常见的错误。当你告诉scanf
读取整数(或浮点数等)时,它会在不再看到任何数字时停止读取。这意味着你可能至少在流上有一个剩余的'\n'
。用户可能还输入了您要丢弃的其他(错误)输入。
丢弃用户输入的想法太可怕了!您应该考虑以不同的形式接受输入(例如,使用argv
中的int main(int argc, char **argv)
),让他们的不舒服的生活更舒适。
如果您不能这样做(或者您不想这样做),您可以使用以下代码之一来放弃(包括)下一个'\n'
:
void fdiscardline(FILE *f) {
int c;
do {
c = fgetc(f);
} while (c != EOF && c != '\n');
}
void fdiscardline(FILE *f) {
fscanf(f, "%*[^\n]");
fgetc(f);
}
您应该在输入之后使用此,而不是之前的。此外,您需要考虑i
应该是什么。如果可以读取更多输入(例如while (i==0)
),它应该为零,或者当输入未正确读取时为零吗?你需要保持一致,因为这是你的循环终止条件。例如:
#include <stdio.h>
int main() {
double A1;
int n1, loopchck, i=0;
while (i==0) {
printf("Enter a real number and inerger (A n): ");
loopchck=scanf_s(" %lf %d", &A1, &n1);
fdiscardline(stdin);
if (loopchck == 2) {
i = 0;
}
else {
i = 1;
}
}
return 0;
}