Scanf после для цикла - PullRequest
       9

Scanf после для цикла

0 голосов
/ 22 февраля 2019

Я не понимаю, почему, если я вставлю букву, программа выполнит printf после цикла for, не позволяя мне вставить значение для scanf после цикла for.

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

1 Ответ

0 голосов
/ 22 февраля 2019

Поскольку при вводе буквы для прерывания цикла for введенное значение остается в буфере стандартного ввода неиспользованным.%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.

Похожие: Почему все говорят, что не следует использовать scanf?Что я должен использовать вместо этого?

...