Проверка, является ли ввод целым числом
Мне нужно сделать функцию, которая получает ввод от пользователя и удостоверяется, что это целое число и не содержит символов.
Я написал этот код, который отлично работает для целых чисел и для отдельных символов. Но это заканчивается, если я вхожу dfd
т.е. многократный ввод символов. Ниже приведен мой код, скомпилированный с помощью gcc в Linux:
#include <ctype.h>
int getint()
{
int input = 0;
int a;
int b, i = 0;
while((a = getchar()) != '\n')
{
if (a<'0'||a>'9')
{
printf("\nError in input!Please try entering a whole number again:");
input=0;
fflush(stdin);
return getint();
}
b = a - '0';
input = ((input*10) + b);
i++;
}
return input;
}
3 ответа
Проблема может быть в том, что вызов fflush (stdin) не определен. fflush предназначен для очистки выходного потока, а не входного потока. Попробуйте заменить его другим способом, чтобы очистить оставшийся входной буфер, например while (getchar() != '\n');
и посмотрите, решит ли это проблему. (вероятно, вы должны сделать что-то более надежное, например, перехватывать EOF, чтобы не быть в бесконечном цикле)
Призвание fflush
во входном потоке вызывает неопределенное поведение. Даже если ваша реализация определяет его для входных потоков, он не переносим. Не существует стандартного способа очистки входного потока. Следовательно fflush(stdin);
не является правильным. Вы должны прочитать символы и отбросить их до и включая новую строку в stdin
буфер. Я предлагаю следующее изменение вашей функции.
int getint(void) {
int input = 0;
int a;
while((a = getchar()) != '\n') {
if (a < '0' || a > '9') {
printf("Error in input!Please try entering a whole number again:\n");
input = 0;
// read and discard characters in the stdin buffer up till
// and including the newline
while((a = getchar()) != '\n'); // the null statement
return getint(); // recursive call
}
input = (input * 10) + (a - '0');
}
return input;
}
Также, пожалуйста, прочтите этот C FAQ - Если fflush не будет работать, что я могу использовать для очистки ввода?
Изменение fflush
в fpurge
заставил вашу программу начать работать на меня.