我不明白为什么如果我插入一个字母,程序在for循环后执行printf
,而不让我在for循环后插入scanf
的值。
int main()
{
float ascissa, ordinata, d, dis, a[50];
int i=0, j, count = 0;
for(;;){
printf("Inserisci ascissa: (oppure inserisci una lettera per terminare): ");
if(scanf("%f", &ascissa) != 1)
break;
printf("Inserisci ordinata: ");
scanf("%f", &ordinata);
punto p1 = creaPunto(ascissa, ordinata);
printf("Inserisci ascissa: ");
scanf("%f", &ascissa);
printf("Inserisci ordinata: ");
scanf("%f", &ordinata);
punto p2 = creaPunto(ascissa, ordinata);
dis = distanza(p1, p2);
a[i]=dis;
i++;
}
printf("Inserisci d: ");
scanf("%f", &d);
for(j=0; j<i; j++)
if(a[j]<d)
count++;
printf("Coppie che hanno distanza minore di d: %d\n", count);
}
因为当您输入一个字母来打破for
循环时,输入的值在stdin缓冲区中保持未使用状态。由于格式匹配失败,%f
不消耗输入。
您需要自己清除任何此类未消耗的输入。例如,您可以使用清除功能:
void clear_stdin(void)
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
并称之为:
printf("Inserisci ascissa: (oppure inserisci una lettera per terminare): ");
if(scanf("%f", &ascissa) != 1) {
clear_stdin();
break;
}
同样,您需要错误检查并清除所有scanf调用。
相关:Why does everyone say not to use scanf? What should I use instead?