#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() отбрасывает все буферизованные данные, которые были извлечены из базового файла, но не были использованы приложением.