Проверка ошибок для символа при чтении в целых числах в C
Для моего класса программирования я написал программу для вычисления суммы делителей. Итак, я дошел до своей последней части, которая относится к проверке ошибок, с которой у меня возникают проблемы, если я читаю символ. Я раньше искал на SO, а также пытался что-то выяснить и не смог найти решение, которое работает для бесконечных отрицательных чисел до 100.
Когда я нажимаю на символ, он устанавливает его в 0 и просто идет до конца, где я хочу, чтобы он вышел, как только он прочитает его в
int main (void){
int userIN=0;
int i = 0;
int next = 0;
int temp= 105;
int cycle;
puts("Enter up to 10 integers less than or equal to 100");
while(scanf("%d ", &userIN) !=EOF && (i < 10))
{
if(userIN > 100){
printf("Invalid Input\n");
exit(1);
}
else if(userIN < 100)
{
Спасибо за помощь в продвижении
РЕДАКТИРОВАТЬ: программа проходит через правильно, моя проблема проверки ошибок для ввода символа не что-нибудь с самим кодом
2 ответа
scanf()
возвращает значение, отличное от EOF
если он не может прочитать значения, указанные в строке формата (например, с %d
, он встречает данные как foo
). Вы можете проверить это. Предостережение заключается в том, что он не читает оскорбительные данные из stdin
так что это все еще будет там, чтобы повлиять на следующий вызов scanf()
- что может привести к бесконечному циклу (scanf()
сообщить об ошибке, позвоните scanf()
опять же, он сталкивается с тем же вводом, поэтому выдает ту же ошибку).
Возможно, вам лучше прочитать целую строку ввода, используя fgets()
, Затем проверьте ввод вручную или используйте sscanf()
(обратите внимание на дополнительные s
во имя). Преимущество такого подхода состоит в том, что легче избежать бесконечного цикла при неожиданном вводе пользователем.
Вы могли бы пока i
меньше 10. Первый if увидит, что scanf не удалось. Если это так, входной буфер очищается, и цикл while пытается снова. Если EOF захвачен, то exit
, Если scanf успешен, вход сравнивается со 100, а если в диапазоне, счетчик цикла while увеличивается.
декларировать int ch = 0;
while ( i < 10) {
printf("Enter %d of 10 integers. (less than or equal to 100)\n", i + 1);
if(scanf(" %d", &userIN) != 1)
{
while ( ( ch = getchar()) != '\n' && ch != EOF) {
//clear input buffer
}
if ( ch == EOF) {
exit ( 1);
}
}
else {
if(userIN > 100){
printf("Invalid Input\n");
}
else
{
i++;// good input advance to the next input
printf("Valid");
}
}
}