c - 如何检查在C中以dd-mm-yyyy形式输入日期的数字?
问题描述
我们可以检查日期输入表单 dd-mm-yyyy 并检查用户输入的数字吗?例如用户输入 7-7-2000,无效,必须是 07-07-2000。
这是我的代码。
int dateCheck(int argc, const char * argv[]){
int day;
int month;
int year;
int count = 0;
char inputValue[20];
printf("Enter date : ");
fgets(inputValue, sizeof(inputValue), stdin);
sscanf(inputValue, "%d-%d-%d",&day,&month,&year);
if ((year >= 1919) && (year <= 2119)) {
if ((month >= 1) && (month <= 12)) {
if ( ((day >= 1) && (day <= 31)) && ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 9) || (month == 11)) ) {
printf("Valid.\n");
}
else if ( ((day >= 1) && (day <= 30)) && ((month == 4) || (month == 6) || (month == 8) || (month == 10) || (month == 12)) ){
printf("Valid.\n");
}
else if ( ((day >= 1) && (day <= 28)) && (month == 2) ){
printf("Valid.\n");
}
else if ( (day == 29) && (month == 2) && ( (year%400 == 0) || ((year%4 == 0) && (year%100 != 0)) ) ){
printf("Valid.\n");
}
else{
printf("Invalid.\n");
}
}
else{
printf("Invalid.\n");
}
}
else{
printf("Invalid.\n");
}
解决方案
我们可以检查日期输入表单 dd-mm-yyyy 并检查用户输入的数字吗?
当然,使用一些辅助函数怎么样?
将任务划分为概念部分并为每个部分编写代码。分而治之。
// return 0: fail
// return 1: success
static int scan_int(int *dest, const char *s, int min, int max, int digits,
char endchar) {
*dest = 0;
for (int i = 0; i < digits; i++) {
if (*s < '0' || *s > '9')
return 0;
*dest = *dest * 10 + *s - '0';
s++;
}
return *dest >= min && *dest <= max && *s == endchar;
}
static int isleapyear(int year) {
if (year % 4) return 0;
if (year > 1582) { // see https://en.wikipedia.org/wiki/Gregorian_calendar
if (year % 100 == 0 && year % 400) return 0;
}
return 1;
}
static int eom(int year, int month) {
static char eoms[1 + 12] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month != 2) {
return eoms[month];
}
return eoms[month] + isleapyear(year);
}
现在配备了一些辅助功能,任务被直接编码。
// dd-mm-yyyy
#define YEAR_MIN 1919
#define YEAR_MAX 2019
int dateCheck(void) {
int day, month, year;
char inputValue[20] = {0};
printf("Enter date : ");
fgets(inputValue, sizeof inputValue, stdin);
if (scan_int(&year, &inputValue[3 + 3], YEAR_MIN, YEAR_MAX, 4, '\0')
&& scan_int(&month, &inputValue[3], 1, 12, 2, '-')
&& scan_int(&day, inputValue, 1, eom(year, month), 2, '-')) {
printf("Valid. %02d-%02d-%04d\n", day, month, year);
return 1;
}
printf("Invalid.\n");
return 0;
}
妙招:代码day
在获取有效的year, month
.
推荐阅读
- r - 在 R 中将栅格转换为空间点数据框时出错
- powershell - 带有 -Force 的 cmdlet Stop-Process 不起作用
- java - Eclipse 中的 Spring MVC 项目设置 - 单独的基础包和 web 和 rest api
- c# - VisualStudio 2015 C# WPF 中 POST 的 405 响应来自我的 WS Rest/java
- java - Java REST API 身份验证,JWT 最佳实践
- ios - 尝试从结构访问 JSON 数据时出现索引超出范围错误
- google-app-maker - 谷歌应用程序制造商:如何保护服务器脚本中的敏感数据?
- tensorflow - How to find out more about the Cloud TPU device you are running your programs against?
- apache-spark - spark如何按数据类型的列减少日期
- database - 多个可为空的外键与多个资源表