Ошибка времени выполнения при использовании exit_failure в программе на C - PullRequest
0 голосов
/ 31 января 2019

Итак, я создал программу, в которой вам нужно ввести дату дд / мм / гггг, а затем вы получите date.day + 1, но я не хочу проверять, что введенная дата действительна, то есть дата.day от 1 до 31, месяц от 1 до 12 и год от 1 до 9999, и введенный день меньше числа дней в этом месяце, если один из них не пройден, возврат из-за ошибки

     `// Program to determine tomorrow's date

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>

    struct date
    {
     int day;
     int month;
     int year;
    };

    int main(void)
    {
        struct date today, nextDay;
        bool isValidDate(struct date VarName);
        struct date dateUpdate(struct date today);


        printf("Enter today's date (dd mm yyyy): ");
        scanf("%i %i %i", &today.day, &today.month, &today.year);

        if (isValidDate(today) == false)
        {
            printf("Invalid date format. \n");
            exit(EXIT_FAILURE);
        }

        nextDay = dateUpdate(today);

        printf("Tomorrow's date is: %i/%i/%i \n", nextDay.day, 
        nextDay.month,             
        nextDay.year % 100);

        return 0;
    }
    // Function to update today's date to tomorrow's date
    struct date dateUpdate(struct date today)
    {
        struct date tomorrow;
        int numberOfDays(struct date VarName);

        if (today.day != numberOfDays(today)) // End of day
        {
            tomorrow.day = today.day + 1;
            tomorrow.month = today.month;
            tomorrow.year = today.year;
        }
        else if (today.month == 12)         // End of year
        {
            tomorrow.day = 1;
            tomorrow.month = 1;
            tomorrow.year = today.year + 1;
        }
        else                                // End of month
        {
            tomorrow.day = 1;
            tomorrow.month = today.month + 1;
            tomorrow.year = today.year;
        }
        return tomorrow;
    }
    // Function to find the numbers of days in a month
    int numberOfDays(struct date VarName)
    {
        const int daysPerMonth[13] = {0, 31, 28, 31, 30, 31, 30,
                                  31, 31, 30, 31, 30, 31
                                 };
        int days;
        bool isLeapYear(struct date VarName);
        bool isValidDate(struct date VarName);

        if (isLeapYear(VarName) == true && VarName.month == 2)
        {
            days = 29;
        }
        else
        {
            days = daysPerMonth[VarName.month];
        }

        return days;

    }
    // Function to determine if a year is a leap year
    bool isLeapYear(struct date VarName)
    {
        bool leapYearFlag;
        if ((VarName.year % 4 == 0 && VarName.year % 100 != 0) ||
            VarName.year % 400 == 0)
        {
            leapYearFlag = true; // It's a leap year
        }
        else
        {
            leapYearFlag = false; // Not a leap year
        }
        return leapYearFlag;
    }
    bool isValidDate(struct date VarName)
    {
        if ( (VarName.day < 1 && VarName.day > 31) || (VarName.day >         
         numberOfDays(VarName)) ) // Day format verifier
        {
            return false;
        }
        else if (VarName.month < 1 && VarName.month > 12) 
                                                // Month format verifier      

        {
            return false;
        }
        else if (VarName.year < 1 && VarName.year > 9999)
                                                 // Year format verifier

        {
            return false;
        }
        else
        {
            return true;
        }
       }`

ИСПЫТАНИЕ A

Введите текущую дату (дд мм гггг): 31 13 2018

РЕЗУЛЬТАТ

prog_8.4.c: 78: 16: ошибка времени выполнения: индекс 13 выходит за границы для типа 'const int [13]' Неверный формат даты.

ТЕСТ B

Введите сегодняшнюю дату (дд мм гггг): 31 2 2018

РЕЗУЛЬТАТ

Неверный формат даты.

ТЕСТ C

Введите сегодняшнюю дату (дд мм гггг): 31 12 2018

РЕЗУЛЬТАТ

Завтрашняя дата: 01.01.19

если вы заметите, что если месяц больше 13, я получаю ошибку времени выполнения, которую я не хочу получать, я не хочу получатьто же сообщение, что и в тесте B, в котором введенный день больше, чем дни этого месяца, если у меня есть свой верификатор формата перед функцией DateUpdate, почему компилятор запускает функцию DateUpdate, потому что я думаю, что ошибка связана с этой функцией, ноесли мой верификатор ошибок работает правильно, программа не запустит эту функцию, потому что она прекратит работу до того, как туда доберется, по крайней мере, это то, что я думаю, не могли бы вы помочь мне здесь, пожалуйста?

1 Ответ

0 голосов
/ 31 января 2019

Я полагаю, что проблема заключается в следующем:

if ( (VarName.day < 1 && VarName.day > 31) || (VarName.day >         
     numberOfDays(VarName)) ) // Day format verifier

Как вы видите ниже, для 13 в const in daysPerMonth[13] нет индекса для 13.У вас есть только индекс от 0 до 12, и в функции bool isValidDate() вы помещаете Varname без проверки, находится ли индекс между 1 и 12.

Проверка индекса перед помещением Varname внутри numberOfDays() исправит вашу проблему.

...