在 C 程序中使用 exit_failure 时出现运行时错误
Runtime error while using exit_failure in a C program
所以我创建了一个程序,你必须在其中输入日期 dd/mm/yyyy 然后你会得到 date.day + 1 ,但我不想验证输入的日期是否有效,即date.day1到31之间,1到12之间的月,1到9999之间的年,输入的那一天小于该月的天数,如果其中之一失败return退出失败
`// 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
输入今天的日期 (dd mm yyyy): 31 13 2018
结果
prog_8.4.c:78:16: 运行时间错误:索引 13 超出类型 'const int [13]' 的范围
日期格式无效。
测试 B
输入今天的日期 (dd mm yyyy): 31 2 2018
结果
日期格式无效。
测试 C
输入今天的日期 (dd mm yyyy):2018 年 12 月 31 日
结果
明天的日期是:1/1/19
如果你注意到,如果有一个大于 13 的月份,我会得到一个 运行 时间错误,这是我不想得到的,我不想得到与测试 B 相同的消息,其中输入的日期大于该月的天数,如果我在 DateUpdate 函数之前有我的格式验证器为什么编译器 运行s DateUpdate 函数,因为我认为错误与此函数有关,但是如果我的错误验证器工作正常程序不会 运行 这个函数,因为它会在到达那里之前终止,至少我是这么想的,你能帮我吗?
我猜问题出在这里:
if ( (VarName.day < 1 && VarName.day > 31) || (VarName.day >
numberOfDays(VarName)) ) // Day format verifier
如下图所示,const in daysPerMonth[13]
中没有 13 的索引。您只有从 0 到 12 的索引,并且在函数 bool isValidDate()
中,您放置了 Varname
而没有检查索引是否在 1 到 12 之间。
在将 Varname
放入 numberOfDays()
之前检查索引将解决您的问题。
所以我创建了一个程序,你必须在其中输入日期 dd/mm/yyyy 然后你会得到 date.day + 1 ,但我不想验证输入的日期是否有效,即date.day1到31之间,1到12之间的月,1到9999之间的年,输入的那一天小于该月的天数,如果其中之一失败return退出失败
`// 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
输入今天的日期 (dd mm yyyy): 31 13 2018
结果
prog_8.4.c:78:16: 运行时间错误:索引 13 超出类型 'const int [13]' 的范围 日期格式无效。
测试 B
输入今天的日期 (dd mm yyyy): 31 2 2018
结果
日期格式无效。
测试 C
输入今天的日期 (dd mm yyyy):2018 年 12 月 31 日
结果
明天的日期是:1/1/19
如果你注意到,如果有一个大于 13 的月份,我会得到一个 运行 时间错误,这是我不想得到的,我不想得到与测试 B 相同的消息,其中输入的日期大于该月的天数,如果我在 DateUpdate 函数之前有我的格式验证器为什么编译器 运行s DateUpdate 函数,因为我认为错误与此函数有关,但是如果我的错误验证器工作正常程序不会 运行 这个函数,因为它会在到达那里之前终止,至少我是这么想的,你能帮我吗?
我猜问题出在这里:
if ( (VarName.day < 1 && VarName.day > 31) || (VarName.day >
numberOfDays(VarName)) ) // Day format verifier
如下图所示,const in daysPerMonth[13]
中没有 13 的索引。您只有从 0 到 12 的索引,并且在函数 bool isValidDate()
中,您放置了 Varname
而没有检查索引是否在 1 到 12 之间。
在将 Varname
放入 numberOfDays()
之前检查索引将解决您的问题。