Как сделать проверку на double в scanf, если ожидается int? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Возможно ли как-то средствами scanf отловить ввод десятичной точки, чтобы отловить ввод типа 5.8 или 5.0, то есть когда в числе присутствует десятичная точка, а scanf ожидает целое? Другие функции по условию задачи использовать нельзя, а дополнительную переменную double использовать не хочется. Есть варианты?

Решение задачи: «Как сделать проверку на double в scanf, если ожидается int?»

textual
Листинг программы
/* -------------------------------------------------------------------------- */
#include <stdio.h>
/* -------------------------------------------------------------------------- */
#define MIN_NUMBER_OF_PLAYERS  0
#define MAX_NUMBER_OF_PLAYERS 49
/* -------------------------------------------------------------------------- */
int main()
{
   int    result            = 0;
   int    number_of_players = 0;
 
   printf("Enter the number of players: \n");
   result = scanf ("%d", &number_of_players);
 
   if (result == EOF) {
      return 1;
   }
 
   if (result == 0) {
      printf("Invalid input!\n");
      return 1;
   }
 
   if ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
        (number_of_players > MAX_NUMBER_OF_PLAYERS)   ) {
 
      do {
         printf("Please enter a valid number of players [0..49]\n");
         result = scanf ("%d", &number_of_players);
 
         if (result == EOF) {
            return 1;
         }
 
         if (result == 0) {
            printf("Invalid input!\n");
            return 1;
         }
 
      } while ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
                (number_of_players > MAX_NUMBER_OF_PLAYERS) || result != 1);
 
   }
 
   if (number_of_players > 0) {
 
      int ranks[number_of_players];
 
      /* Catching the dot from previous input. */
      result = scanf ("%d", &ranks[0]);
 
      if (result == EOF) {
         return 1;
      }
 
      if (result == 0) {
         printf("Invalid input!\n");
         return 1;
      }
 
      printf("Enter the rank of each player: \n");
 
      for (int i = 1; i < number_of_players; ++i) {
 
         result = scanf ("%d", &ranks[i]);
 
         if (result == EOF) {
            return 1;
         }
 
         if (result == 0) {
            printf("Invalid input!\n");
            return 1;
         }
 
         if (ranks[i] < 0) {
            printf("Please enter a valid rank ( rank >=0 )\n");
            --i;
         }
      }
 
      int rank_difference = 0;
 
      for (int i = 0; i < number_of_players ; ++i) {
 
         for (int k = 0; k < i + 1; ++k) {
            printf("|      ");
         }
 
         for (int j = i + 1; j < number_of_players; ++j) {
 
            rank_difference = ranks[j] - ranks[i];
 
            if (rank_difference < 0) {
               rank_difference = -rank_difference;
            }
            printf("| %4d ",rank_difference);
         }
         printf("|\n");
      }
   }
 
   return 0;
}
/* -------------------------------------------------------------------------- */

Объяснение кода листинга программы

В этом коде выполняется следующая последовательность действий:

  1. Объявляются переменные:
    • result - результат выполнения функции scanf;
    • number_of_players - количество игроков;
    • ranks - массив для хранения рангов игроков;
    • rank_difference - разность рангов.
  2. Выводится сообщение с просьбой ввести количество игроков.
  3. Результат введения количества игроков сохраняется в переменной result после вызова функции scanf.
  4. Проверяется, было ли успешно считано значение. Если нет, программа выводит сообщение об ошибке и завершается.
  5. Если введенное количество игроков меньше минимального или больше максимального допустимого значения, программа просит ввести корректное количество игроков.
  6. Если количество игроков больше нуля, то программа переходит к следующему этапу.
  7. Для каждого игрока запрашивается его ранг.
  8. Если введенный ранг меньше нуля, программа выводит сообщение об ошибке и уменьшает счетчик игроков.
  9. Выводится таблица с разностями рангов.
  10. Программа завершается.

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы