2015-11-07 7 views
2

Для моего класса программирования я написал программу для вычисления суммы делителей. Поэтому я добрался до своей последней части, которая является проверкой ошибок, с которой у меня возникает проблема, если я читаю символ. Я искал S.O. ранее, а также попытался выяснить что-то, и не смог найти решение, которое работает для бесконечных отрицательных чисел до 100.Ошибка проверки символа при чтении в целых числах в C

Когда я ударил персонажа, он устанавливает его в 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) 
    { 

Спасибо за помощь заранее

EDIT: программа на велосипеде через правильно, мой выпуск ошибки проверки характера вводимый не что-нибудь с кодом само по себе

+0

Это не выглядит, как ваш полный код –

+0

его не мой полный код, это то место, где у меня проблема ... чтение в & Узерин как целое Пользователь Вводит a Персонаж Только проверка ошибок только для целых чисел больше 100 Я не хочу добавлять весь свой код, потому что это домашнее задание и не хочу, чтобы кто-то его копировал. –

+0

Вы инициализируете i до нуля? – samgak

ответ

3

scanf() возвращает значение, отличное от EOF, если оно не может прочитать значения, указанные в строке формата (например, с %d, он сталкивается с данными, такими как foo). Вы можете это проверить. Предостережение заключается в том, что он не считывает данные о нарушении от stdin, поэтому он все равно будет влиять на следующий вызов scanf(), что может привести к бесконечному циклу (scanf(), сообщающему об ошибке, вызовет scanf(), он встречает тот же ввод поэтому сообщает о той же ошибке).

Возможно, вам лучше читать всю строку ввода, используя fgets(). Затем проверьте вход вручную или используйте sscanf() (обратите внимание на дополнительное s на имя). Преимущество такого подхода состоит в том, что легче избежать бесконечного цикла при неожиданном вводе пользователя.

1

Вы можете зациклиться, пока i меньше 10. Первый, если увидит, если 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"); 
     } 
    } 
} 
Смежные вопросы