В то время как цикл постоянно проверяет пользовательский ввод на целое число - PullRequest
0 голосов
/ 18 октября 2019

Я знаю, что этот вопрос уже задавался, и мне жаль, но я не могу найти решение для своего кода. Я новичок в языке C, и моя проблема в том, что я пытаюсь создать цикл while, который постоянно просит пользователя обновить данные, если они вводят не целые числа. Я изучил функцию isdigit() и думаю, что это сработает. Я просто не могу заставить его работать для моего кода, так как всякий раз, когда я пытаюсь создать цикл while с isdigit в качестве условия, я либо получаю бесконечный цикл, либо мой isdigit возвращает значения, которые я использовалне ожидая. Я думаю, что проблема может заключаться в том, что мой scanf() сканирует три целых числа, разделенных символом '/', но я не уверен, в этом ли проблема. Любая помощь будет оценена.

Вот код вопроса

#include <stdio.h>
#include <ctype.h>

int calcAge(int a, int b, int c, int d, int e, int f);
int maxHeart(int a);
int heartRangeLow(int a);
int heartRangeHigh(int a);

int main(void) {
    int birthMonth = 0, birthDay = 0, birthYear = 0, targetRangeLow = 0;
    int month = 0, day = 0, year = 0, age = 0, heartRate = 0, targetRangeHigh = 0; 
    printf("What is your birthday?(written in MM/DD/YYYY)"
        "\nHit Enter after you type it in.\n");
    scanf_s("%d/%d/%d", &birthMonth, &birthDay, &birthYear);
    printf("What is the date today?(written as MM/DD/YYYY)"
        "\nHit Enter after you type it in.\n");
    scanf_s("%d/%d/%d", &month, &day, &year);
    age = calcAge(birthMonth, birthYear, birthDay, month, day, year);
    heartRate = maxHeart(age);
    targetRangeLow = heartRangeLow(heartRate);
    targetRangeHigh = heartRangeHigh(heartRate);
    printf("You are %d years old.\n", age);
    printf("Your maximum heart rate is %d beats per minute.\n", heartRate);
    printf("Your target-heart-range is %d"
            " to %d beats per minute.\n", targetRangeLow, targetRangeHigh);
    system("pause");
    return 0;
}

int calcAge(int a, int b, int c, int d, int e, int f)
{
    int age;
    age = ((f * 10000 + d * 100 + e) - (b * 10000 + a * 100 + c)) * .0001;
    return age;
}

int maxHeart(int a)
{
    int heartRateMax;
    heartRateMax = 220 - a;
    return heartRateMax;
}

int heartRangeLow(int a)
{
    int lowTarget = a * .5;
    return lowTarget;
}

int heartRangeHigh(int a)
{
    int highTarget = a * .85;
    return highTarget;
}

1 Ответ

0 голосов
/ 18 октября 2019

для создания цикла while, который постоянно просит пользователя обновить данные, если они вводят не целые числа.

Создать вспомогательную функцию. Считайте пользовательский ввод с помощью fgets() в буфер, а затем проанализируйте его на предмет допустимого ввода с помощью strtol() или sscanf(), is...() и т. Д. Возврат 1, 0, EOF в зависимости от ввода.

// Untested code

// 1 success
// 0 bad input
// EOF end of file
#define DATE_STR_SIZE 80
int enter_date_mdy(char *prompt, int *m, int *d, int *y) {
  if (prompt) {
    fputs(prompt, stdout);
    fflush(stdout);
  }
  char buffer[DATE_STR_SIZE];
  if (fgets(buffer, sizeof buffer, stdin) == NULL) {
    return EOF;
  }
  int n = 0;
  sscanf(buffer, "%d /%d /%d %n", m, d, y, &n);

  // If scan incomplete or extra junk at the end ....
  if (n == 0 || buffer[n]) {
    return 0;
  }

  // Additional tests as desired ....
  if (*m < 1 || *m > 12 || *d < 1 || *d > 31) {
    return 0;
  }

  return 1;
}

Примериспользуйте

int count;
do {
  count = enter_date_mdy("What is your birthday?(written in MM/DD/YYYY)",
    &birthMonth, &birthDay, &birthYear);
  if (count == EOF) return(EXIT_FAILURE);
} while (count < 1);

do {
  count = enter_date_mdy("What is the date today?(written as MM/DD/YYYY)",
    &month, &day, &year);
  if (count == EOF) return(EXIT_FAILURE);
} while (count < 1);

Совет: вместо "What is the date today?", исследование time(), mktime().

...