在循环后扫描

问题描述 投票:0回答:1

我不明白为什么如果我插入一个字母,程序在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);
}
c scanf
1个回答
1
投票

因为当您输入一个字母来打破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?

© www.soinside.com 2019 - 2024. All rights reserved.