Почему это в бесконечном цикле?

#c

#c

Вопрос:

 I want to take input of integer and want to check that input is only one integer. So I have implemented some logic. But it's in infinite loop.
  

Логика такова: если scanf возвращает 1, это означает, что это совпадение, а если нет, то это не целое число, и поскольку число должно быть больше 5, я тоже добавил эту проверку.

 #include <stdio.h>
int main()
{
    //Variable Declarations
    int a[1000],n,i,j,int_check=0;

    //Input for number of terms and it should be at least 5
    printf("Enter the number of terms for the array input:");
    int_check=scanf("%d",amp;n);
    printf("nscanf=%d and n=%dn",int_check,n);

    //Input Validity checking. If scanf returns 1 that means it's a match with the input. Number of terms should be greater than 5.
    while(int_check!=1 || n<5)
    {
    printf("Enter the valid number of terms for the array inout. It should be an integer and greater than 5:");
    int_check=scanf("%d",amp;n);   

    }

    return 0;

}
  

Он должен предоставлять один экран ввода. Помогите мне определить, что не так в этой логике.

Ответ №1:

если вы не вводите допустимое целое число для scanf("%d",...); неверного ввода, оно не удаляется, поэтому вы получите его в следующем scanf("%d",...); , поэтому (int_check!=1 || n<5) никогда не будет false

вам нужно очистить недопустимый ввод самостоятельно, предупреждение не использовать fflush(stdin); , потому что это работает только с файлом

Обратите внимание, чтобы увидеть сообщение, которое вам нужно очистить, например, заменить

     printf("Enter the valid number of terms for the array inout. It should be an integer and greater than 5:");
  

Автор:

     printf("Enter the valid number of terms for the array inout. It should be an integer and greater than 5:n");
  

или используйте fflush(stdout); после printf, если вы предпочитаете оставаться на одной строке

Комментарии:

1. Но ожидается, что он должен попросить меня снова ввести ввод. Почему бы и нет, он спрашивает. Вместо этого это в бесконечном цикле.

2. @DipakChatterjee поскольку, как уже было сказано, ввод не удаляется, вам нужно удалить его самостоятельно, например, читая символ за символом до n (также управляя регистром EOF)

3. @DipakChatterjee вы не видите сообщение, потому что пропустили вывод новой строки, чтобы очистить ее

4. Вместо того, чтобы полагаться на fflush(stdin) (поведение не определено в стандартном C или даже POSIX), предпочитайте fgets() , возможно, следовать sscanf() .

5. @DipakChatterjee fflush(stdout) работает, но обычно ffluch(stdin) не работает, и предположить, что это работает, не переносимо. Описание таково: для входных потоков, связанных с файлами, которые можно искать (например, с файлами на диске, но не с каналами или терминалами), fflush() отбрасывает все буферизованные данные, которые были извлечены из базового файла, но не были использованы приложением.