Запрашивает пользователя для ввода до новой строки и проверяет, является ли ввод допустимым

#c #loops

Вопрос:

Эта программа запрашивает у пользователя оценки викторины и сохраняет их в массиве. Пользователь может ввести максимум 10 оценок, но может ввести и меньше. Программа должна проверить ошибку: если пользователь вводит недопустимую оценку, программа должна выполнять цикл до тех пор, пока пользователь правильно не введет допустимую оценку

 #include lt;stdio.hgt;  #define N 10 /* number of students in class */  int main()  {  int quiz[N], /* array of quiz grades */  grade, /* used to read in one grade */  last, /* index of last element used */  i, /* loop variable */  ib /* input buffer */;  char c;    last = -1;    printf("Enter the quiz grade: ");    while (ib=scanf("%d",amp;grade) amp;amp; lastlt;N-1)  {    if(ib == 0 ){  printf("Please enter a valid quiz grade: ");  while((c=getchar())!='n' amp;amp; c!=EOF);  }  else   if(grade gt;= 0 amp;amp; grade lt;= 10)  {  last  ;  quiz[last] = grade;  }  else{  printf("Enter a quiz grade between 0 and 10");  }  }  }  

Этот код не останавливается на количестве введенных оценок, а скорее заполняет массив последней оценкой до тех пор, пока ее размер не станет N.

Кроме того, когда пользователь вводит нецифровый ввод, программа останавливается, когда она должна предложить пользователю ввести допустимую оценку

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

1. «не работает» никогда не является хорошим описанием проблемы. Пожалуйста, укажите точные данные, ожидаемый результат и фактический результат.

2. Если «не работает» означает «не компилируется», это довольно нормально, вы не объявляете переменную sum , и финал } отсутствует

3. getchar неосознанно возвращает int не a char . c должно быть int , иначе это не выдержит EOF .

4. Я только что отредактировал свой вопрос. Надеюсь, это более понятно

5. Не пытайтесь проверять вводимые пользователем данные с scanf помощью . Это не может быть сделано должным образом, scanf не создано для этого. Если вы введете, скажем abc , scanf вернет 0 в вашем случае, потому что он не смог отсканировать число. Тогда ABC он все равно будет находиться во входном буфере.

Ответ №1:

По крайней мере, одна ошибка здесь:

 while (ib=scanf("%d",amp;grade) amp;amp; lastlt;N-1)  

Предположим, что scanf возвращает ноль (т. е. ib становится нулем), то вышесказанное совпадает с:

 while (0 amp;amp; lastlt;N-1)  

что то же самое, что

 while (0)  

это означает, что ваш цикл останавливается, когда вводится что-то, не являющееся числом.

Также обратите внимание, что из-за вышесказанного, ib не может быть нуля при выполнении:

 if(ib == 0 ){  // So this code can't be reached  printf("Please enter a valid quiz grade: ");  while((c=getchar())!='n' amp;amp; c!=EOF);  }  

Чтобы решить эту проблему, вы можете scanf вывести условие из while состояния. Нравится:

 while (lastlt;N-1)  {  ib=scanf("%d",amp;grade);  if(ib != 1 ) // Notice this change  {  if (ib == EOF) exit(1); // Check for fatal input error   printf("Please enter a valid quiz grade: ");  while((c=getchar())!='n' amp;amp; c!=EOF);   if (c == EOF) exit(1); // Check for fatal input error  }  else   {  ...  }  }  

Также измените char c; на int c; as getchar возвращает an int , чтобы обработать EOF

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

1. Я вижу! Что же тогда должно войти в цикл? Я хочу предложить пользователю ввести ввод до тех пор, пока он не достигнет N