当用户输入月,日和年时,我需要以四种格式打印日期。 例如,如果我输入“ 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个月的1月的jan时,我在控制台1/-858993460/-858993460
中得到了奇怪的值,然后终止。但是当我输入2005年3月5日时,我会得到
3/5/2005
March2005
ory corruption5
ory corruptionmar-5
我创建Date的实例并调用3参数构造函数。然后,3参数构造函数调用一个validate函数,该函数返回一个布尔值。如果返回值为false,它将调用默认构造函数,该函数将所有内容都设置为2001年1月1日。
//更新: 将date.cpp中的int索引的初始值更改为-1而不是NULL。现在,当我输入“ jan”时,执行此操作将调用打印功能四次四次,但仍然得到奇怪的结果
1/5/2005
January2005 //This should be January 5, 2005
ory corruption5
ory corruptionmar-5
为什么第一次调用print时我的所有成员变量都保留值,但是第二,第三和第四次的日期丢失了,并显示了奇怪的损坏消息? 我不知道发生了什么,但是当我还输入一个无效的日期(例如,“ jan”表示月份,但输入36表示天,使用2025表示年)时,默认构造函数应将month设置为January,将day设置为1,将year设置为2001,但是我得到垃圾值
1/-858993460/-858993460
这是第一次调用打印,然后终止打印。
//标题
#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
// 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;
}
}
// Test.cpp
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
#include "date.h"
void setDateValues(string&, int&, int&);
int main()
{
string mth;
int day, yr;
setDateValues(mth, day, yr);
transform(mth.begin(), mth.end(), mth.begin(), (int(*) (int)) tolower);
Date d1(mth, day, yr);
cout << "Date is:\n";
DateFormat type;
type = mdy1;
d1.print(type);
type = mdy2;
d1.print(type);
type = ymd1;
d1.print(type);
type = ymd2;
d1.print(type);
return 0;
}
void setDateValues(string & m, int& d, int& y)
{
cout << "Enter month: ";
cin >> m;
cout << "Enter day: ";
cin >> d;
cout << "Enter year: ";
cin >> y;
}
答案 0 :(得分:3)
对此有一个标准的库函数:strftime()
。
您在结构中给它一个日期,并编写一个字符串。对于您的四种情况,格式字符串为:
1) %m/%d/%Y
2) %B %d, %Y
3) %F
4) %Y-%b-%d