每天都在头秃 2023-10-21 00:19 采纳率: 96.7%
浏览 7
已结题

C++日期类转化成特定格式字符时遇到的问题

我在写一个C++日期类的题目时在指令2是需要以一定的格式输出日期,比如
input:2 21 SEPTEMBER 2001
output:moonLanding = 21-Sep-2001
然而我的输出却是:moonLanding = 3276916-?2001
我第一次自己差的时候发现monthtoString()的方法有点问题,不会输出一个月份的字符串,但是我看了看又没看出毛病?
再检查的时候输出day的时候好像也出问题了。
我检查了几遍但是没能确定问题出在哪里,因为代码比较长我把相关的代码摘出来。希望能帮忙看看?

#include <string>
#include <iostream>
#include "lib.h" 
#include "calendar.h" 
using namespace std;

std::string integerToString(int n) {
    std::ostringstream stream;
    stream << n;
    return stream.str();
}

Month stringToMonth(string s)
{
   Month mon;
   if (s == "JANUARY") {
      mon= JANUARY;
   }
   if (s == "FEBRUARY") {
      mon= FEBRUARY;
   }
   if (s == "MARCH") {
      mon= MARCH;
   }
   if (s == "APRIL") {
      mon= APRIL;
   }
   if (s == "MAY") {
      mon= MAY;
   }
   if (s == "JUNE") {
      mon= JUNE;
   }
   if (s == "JULY") {
      mon= JULY;
   }
   if (s == "AUGUST") {
      mon= AUGUST;
   }
   if (s == "SEPTEMBER") {
      mon= SEPTEMBER;
   }
   if (s == "OCTOBER") {
      mon= OCTOBER;
   }
   if (s == "NOVEMBER") {
      mon= NOVEMBER;
   }
   if (s == "DECEMBER") {
      mon= DECEMBER;
   }
   return mon;
}

string monthToString(Month month)
{
   // TODO
   //change the month to string
   string s;
   if(month==JANUARY){
      s="JANUARY";
   }
   else if(month==FEBRUARY){
      s="FEBRUARY";
   }
   else if(month==MARCH){
      s="MARCH";
   }
   else if(month==APRIL){
      s="APRIL";
   }
   else if(month==MAY){
      s="MAY";
   }
   else if(month==JUNE){
      s="JUNE";
   }
   else if(month==JULY){
      s="JULY";
   }
   else if(month==AUGUST){
      s="AUGUST";
   }
   else if(month==SEPTEMBER){
      s="SEPTEMBER";
   }
   else if(month==OCTOBER){
      s="OCTOBER";
   }
   else if(month==NOVEMBER){
      s="NOVEMBER";
   }
   else if(month==DECEMBER){
      s="DECEMBER";
   }

   return s;
}
Date::Date()
{
   initDate(1, JANUARY, 1900);
}

Date::Date(int day, Month month, int year)
{
   initDate(day, month, year);
}

Date::Date(Month month, int day, int year)
{
   initDate(day, month, year);
string Date::toString()
{
   // TODO
   string re;
   string mon;
   mon =monthToString(month);
   //cout<<mon<<endl;
   //lower case
   mon[1]=tolower(mon[1]);
   mon[2]=tolower(mon[2]);
   //deal with the string
   string mmm;
   mmm=mon[0]+mon[1]+mon[2];
   //cout<<day<<endl;
   //cout<<year<<endl;
   re=integerToString(day)+"-"+mmm+"-"+integerToString(year);
   return re;
}

void Date::initDate(int day, Month month, int yyyy)
{
   // TODO
  day=day;
  month=month;
  year=yyyy;
}

int main()
{
   int id;
   cin >> id;
   int day, year;
   string mon;
   cin >> day >> mon >> year;

   if (id == 1)
   {
      for (Month month = JANUARY; month <= DECEMBER; month = Month(month + 1))
      {
         cout << monthToString(month) << " has " << daysInMonth(month, year)
              << " days." << endl;
      }
   }
   else if (id == 2)
   {
      Date moonLanding(day, stringToMonth(mon), year);
      cout << "moonLanding = " << moonLanding.toString() << endl;
   }
   else if (id == 3)
   {
      Date moonLanding(day, stringToMonth(mon), year);
      cin >> mon >> day >> year;
      Date kennedyAssassination(stringToMonth(mon), day, year);
      cin >> mon >> day >> year;
      Date newYearsEve(stringToMonth(mon), day, year);
      cin >> day >> mon >> year;
      Date inaugurationDay(day, stringToMonth(mon), year);
      cin >> day >> mon >> year;
      Date electionDay(day, stringToMonth(mon), year);
      cout << "moonLanding = " << moonLanding << endl;
      cout << "kennedyAssassination = " << kennedyAssassination << endl;
      cout << boolalpha;
      cout << "moonLanding < kennedyAssassination = "
           << (moonLanding < kennedyAssassination) << endl;
      cout << "moonLanding > kennedyAssassination = "
           << (moonLanding > kennedyAssassination) << endl;
      cout << "moonLanding == kennedyAssassination = "
           << (moonLanding == kennedyAssassination) << endl;
      cout << "moonLanding == moonLanding = "
           << (moonLanding == moonLanding) << endl;
      cout << "inaugurationDay - electionDay = "
           << (inaugurationDay - electionDay) << endl;
      Date day = newYearsEve;
      cout << "New Year's Eve = " << day++ << endl;
      cout << "New Year's Day = " << day << endl;
      for (Date d = electionDay; d <= inaugurationDay; d++)
      {
         cout << d << endl;
      }
   }
}


  • 写回答

3条回答 默认 最新

  • 关注

    integerToString()函数修改如下:

    std::string integerToString(int n) {
        char s[10]={0};
        itoa(n,s,10);
        return s;
    }
    
    

    monthToString()函数加个else,在传参错误的时候有个提示,方便查找原因:

    string monthToString(Month month)
    {
        // TODO
        //change the month to string
        string s;
        if(month==JANUARY){
            s="Jan";
        }
        else if(month==FEBRUARY){
            s="Feb";
        }
        else if(month==MARCH){
            s="Mar";
        }
        else if(month==APRIL){
            s="Apr";
        }
        else if(month==MAY){
            s="May";
        }
        else if(month==JUNE){
            s="Jun";
        }
        else if(month==JULY){
            s="Jul";
        }
        else if(month==AUGUST){
            s="Aug";
        }
        else if(month==SEPTEMBER){
            s="Sep";
        }
        else if(month==OCTOBER){
            s="Oct";
        }
        else if(month==NOVEMBER){
            s="Nov";
        }
        else if(month==DECEMBER){
            s="Dec";
        }else
            s = "ERROR"; //这里加个提示,避免传入参数错误
    
        return s;
    }
    
    

    Date::toString()函数修改如下:

    string Date::toString()
    {
        // TODO
        string re;
        string mon;
        char tmp[4]={0};
        mon =monthToString(month);
        //cout<<mon<<endl;
        //lower case
        tmp[0]=mon[0];
        tmp[1]=tolower(mon[1]);
        tmp[2]=tolower(mon[2]);
        //deal with the string
        string mmm = tmp;
        //cout<<day<<endl;
        //cout<<year<<endl;
        re=integerToString(day)+"-"+mmm+"-"+integerToString(year);
        return re;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月21日