C++ 以四种格式打印日期
当用户输入月、日和年时,我需要以四种格式打印日期。 例如,如果我输入“sept”表示月份,输入17表示日期,输入1921表示年份,它将打印出:C++ 以四种格式打印日期,c++,C++,当用户输入月、日和年时,我需要以四种格式打印日期。 例如,如果我输入“sept”表示月份,输入17表示日期,输入1921表示年份,它将打印出: 1) 9/17/1921 2) September 17,1921 3) 1921-9-17 4) 1921-sep-17 我还进行验证,如果天数小于1天或大于该月的天数,且年份不能小于1900天或大于2020天。如果是,则月份默认为“一月”日到1,年份默认为2001年 当我为2005年的第5个月的第5天输入1月时,我在控制台中得到奇怪的值1/-858
1) 9/17/1921
2) September 17,1921
3) 1921-9-17
4) 1921-sep-17
我还进行验证,如果天数小于1天或大于该月的天数,且年份不能小于1900天或大于2020天。如果是,则月份默认为“一月”日到1,年份默认为2001年
当我为2005年的第5个月的第5天输入1月时,我在控制台中得到奇怪的值1/-858993460/-858993460
,然后终止。但当我进入2005年3月5日,我得到
3/5/2005
March2005
ory corruption5
ory corruptionmar-5
我创建一个Date实例并调用一个3参数构造函数。然后,3参数构造函数调用一个返回布尔值的验证函数。如果返回值为false,它将调用默认构造函数,该构造函数将所有内容设置为2001年1月1日
//更新:
将date.cpp中int索引的初始值更改为-1,而不是NULL。现在,当我输入“jan”时,这样做会四次调用print函数,但仍然会得到奇怪的结果
1/5/2005
January2005 //This should be January 5, 2005
ory corruption5
ory corruptionmar-5
为什么第一次打印被称为“所有我的成员变量”时会保留这些值,而第二次、第三次和第四次打印(day)时会丢失并显示奇怪的损坏消息?
我不知道发生了什么,但是当我也输入了一个无效的日期,例如“一月”表示月份,而“36”表示天数,2025表示年份时,默认构造函数应该将月份设置为一月,将天设置为1,将年设置为2001,但我得到了垃圾值
1/-858993460/-858993460
这是第一次调用print,之后它将终止
//标题
#pragma once
#include <iostream>
#include <string>
using namespace std;
/*Add more constants if needed*/
#ifndef DATE_H
#define DATE_H
enum DateFormat { mdy1, mdy2, ymd1, ymd2 };
const int MIN_YEAR = 1900;
const int MAX_YEAR = 2020;
const string monthStr[] = //alternative: const char monthStr[] [15]=
{ "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November",
"December" };
const string monthStrAbbrev[] = //not strictly necessary, but helpful
{ "jan", "feb", "mar", "apr", "may", "jun",
"jul", "aug", "sep", "oct", "nov",
"dec" };
const int monthDays[] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
class Date {
private:
string month;
int day, year;
bool validateDate(string, int, int);
Date();
public:
Date(string, int, int);
void print(DateFormat type);
};
#endif // !DATES_H
#pragma一次
#包括
#包括
使用名称空间std;
/*如果需要,添加更多常量*/
#ifndef日期
#定义日期
枚举日期格式{mdy1,mdy2,ymd1,ymd2};
最小年份常数=1900;
const int MAX_YEAR=2020;
const string monthStr[]=//备选方案:const char monthStr[][15]=
{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”,
“七月”、“八月”、“九月”、“十月”、“十一月”,
“12月”};
const string monthStrAbbrev[]=//严格来说不是必需的,但很有用
{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”,
“七月”、“八月”、“九月”、“十月”、“十一月”,
“dec”};
月日常数[]=
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
上课日期{
私人:
弦月;
国际日,年;
bool validateDate(字符串,int,int);
日期();
公众:
日期(字符串,int,int);
作废打印(日期格式类型);
};
#endif/!日期
//Dates.cpp
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include "date.h"
using std::cout;
using std::cin;
int global;
Date::Date() : month("January"), day(1), year(2001) { cout << "INSIDE CONST" << endl; }
Date::Date(string m, int d, int y)
{
if (!validateDate(m, d, y))
{
cout << "IF FALSE" << endl;
Date();
}
else
{
month = m;
day = d;
year = y;
cout << "MONTH IS :" << month << " DAY IS: " << day << " YEAR IS: " << year << endl;
}
}
bool Date::validateDate(string m, int d, int y)
{
cout << "size is " << sizeof(monthStrAbbrev) / sizeof(monthStrAbbrev[0]) << endl;;
int index = -1;
for (int x = 0; x < 11; x++)
{
string mAbr = monthStr[x].substr (0, 3);
transform(mAbr.begin(), mAbr.end(), mAbr.begin(), (int(*) (int)) tolower);
cout << "Abbr: " << mAbr << endl;
if (m == mAbr)
{
index = x;
global = x;
cout << "x " << x << " global " << global << " Index " << index << endl;
if (d < 1 && d > monthDays[index])
{
cout << "FALSE 1" << endl;
return false;
}
if (y < MIN_YEAR || y > MAX_YEAR)
{
cout << "FALSE 2" << endl;
return false;
}
break;
}
}
if (index == -1)
{
cout << "IF NULL" << endl;
return false;
}
else
{
cout << " IF NOT NULL" << endl;
return true;
}
}
void Date::print(DateFormat type)
{
if (type == mdy1)
{
cout << global + 1 << "/" << day << "/" << year << endl;
}
else if (type == mdy2)
{
cout << monthStr[global] << day + ", " << year << endl;
}
else if (type == ymd1)
{
cout << year + "-" << (global + 1) + "-" << day << endl;
}
else if (type == ymd2)
{
cout << year + "-" << month + "-" << day << endl;
}
}
#包括“stdafx.h”
#包括
#包括
#包括“date.h”
使用std::cout;
使用std::cin;
int全球;
Date::Date():月(“一月”)、日(1)、年(2001){cout此函数有一个标准库函数:
在结构中给它一个日期,它会写一个字符串。对于四种情况,格式字符串为:
1) %m/%d/%Y
2) %B %d, %Y
3) %F
4) %Y-%b-%d
此函数有一个标准库函数:
在结构中给它一个日期,它会写一个字符串。对于四种情况,格式字符串为:
1) %m/%d/%Y
2) %B %d, %Y
3) %F
4) %Y-%b-%d
您在日期结束时缺少#endif
。h
,您正在将int
初始化为NULL
(例如int index=NULL;
),您正在将int
与NULL
(例如if(index==NULL)
)进行比较,并且您有一个赋值而不是一个比较else if(type=ymd2)
。您没有阅读警告吗?(这些警告需要修复,但不会纠正您的逻辑错误)很抱歉,我忘了将其添加到代码段中,但我使用了#endif。此外,index设置为NULL,但在循环中,它被重新分配了一个值,这使它不是NULL,对吗?堆栈溢出不是免费的调试服务,您应该显示您尝试使用调试器或其他更简单的方法(如debug print语句)调试代码。这是这并不是你唯一一次在代码中遇到错误,学习调试程序比让别人帮你找到错误更能帮助你。-858993460是十六进制的0xFFFFFFCCCCCC。对于未初始化的变量或其他东西来说,这可能是一个神奇的调试值。此外,使用命名空间std的也是,尤其是恩,你把它放在一个标题中。我不知道这是否是一个问题,但是当我在V Studio 2017中创建一个新的控制台应用程序时,它会自动创建一个标题文件和包含main的cpp文件。在这种情况下,文件名都是date。但是我喜欢test.cpp,所以我用main()重命名了自动创建的日期cpp文件测试cpp并创建一个单独的日期cpp实现文件。我也知道我应该从std名称空间导入我需要的任何东西,例如使用std::cout等,但我不认为这会是一个问题。您缺少#endif
在date.h
末尾,您正在将int
初始化为NULL
(例如int index=NULL;
),您正在将int
与NULL
进行比较,(例如if(index==NULL)
),您有一个赋值,而不是比较,否则if(type=ymd2)
。您没有阅读警告吗?(这些警告需要修复,但不会更正您的逻辑错误)很抱歉,我忘了将其添加到代码段中,但我使用了#endif。此外,index设置为NULL,但在循环中,它被重新分配了一个值,这使它不是NULL,对吗?堆栈溢出不是免费的调试服务,您应该显示您尝试使用调试器或其他更简单的方法(如debug print语句)调试代码。这是这并不是你唯一一次在代码中遇到错误,学习调试程序比让别人帮你找到错误更能帮助你。-858993460是十六进制的0xFFFFFFCCCCCC。对于未初始化的变量或其他东西来说,这可能是一个神奇的调试值。此外,使用命名空间std的也是,尤其是我不知道这是否是个问题,但当我在V Studio 2017中创建一个新的控制台应用程序时,它会自动创建一个头文件和带有t的cpp文件