C++ 以四种格式打印日期

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

当用户输入月、日和年时,我需要以四种格式打印日期。 例如,如果我输入“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/-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文件