以四种格式打印日期

时间:2018-06-24 01:56:57

标签: 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个月的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;
}

1 个答案:

答案 0 :(得分:3)

对此有一个标准的库函数:strftime()

您在结构中给它一个日期,并编写一个字符串。对于您的四种情况,格式字符串为:

1) %m/%d/%Y
2) %B %d, %Y
3) %F
4) %Y-%b-%d