解决一年中的c ++日

时间:2018-04-06 16:36:55

标签: c++

我是编程新手,我现在正在学习C ++

我有此代码,例如,如果我输入[5],则输出必须为2018 2 32,但现在输出为0且我不知道如何解决这个问题。我需要帮助,并想知道是否有人可以查看我的代码并告诉我它有什么问题?

62

它编译但输出不正确。我非常感谢您的帮助和反馈。非常感谢你

2 个答案:

答案 0 :(得分:2)

这是因为您将days作为31传递,并执行此行:

       if(month == 2)
        {
            dayTotal = january + day;
        }

然后

            dayTotal = 31 + 31;  // = 62 which is what you see.

您需要使用调试器来发现此类错误,除非您需要添加一些验证以防止无效数据,例如02/31/2018

答案 1 :(得分:1)

编辑:

根据@Slava的建议,我修改了我的答案。此实现使用单个正则表达式匹配来验证和提取日期的组件。这是代码:

#include <iostream>
#include <string>
#include <regex>
#include <exception>
using namespace std;

void parseDate(const string& date, int& year, int& month, int& day)
{
    regex dateValidateRe(R"(^(\d{4})\-(\d{1,2})\-(\d{1,2})$)");
    smatch matches;
    if (!regex_search(date, matches, dateValidateRe))
    {
        throw invalid_argument("Date format is incorrect");
    }
    year = stoi(matches[1]);
    month = stoi(matches[2]);
    day = stoi(matches[3]);
}

int main()
{
    int year, month, day;
    string date;
    cin >> date;
    try
    {
        parseDate(date, year, month, day);
    }
    catch (std::exception& ex)
    {
        cout << "Invalid input: " << ex.what() << endl;
    }
    cout << "The date entered was Year = " << year << " Month = " << month << " Day = " << day << endl;
    return 0;
}

这是working demo

**原始回复**

您未正确解析输入。您的输入2018-2-31正在被解析为2018年,第-2个月和第-31天。您需要将日期解析为字符串,然后通过令牌-将该字符串拆开以提取年,月和日。

这是一个快速而脏的函数,可用于正确解析输入:

void parseDate(const string& date, int& year, int& month, int& day)
{
    auto ypos = date.find("-");
    string syear = date.substr(0, ypos);
    auto mpos = date.find("-", ypos+1);
    string smonth = date.substr(ypos+1, mpos-ypos-1);
    string sday = date.substr(mpos+1);
    year = stoi(syear);
    month = stoi(smonth);
    day = stoi(sday);
}

按如下方式更新您的主页:

int main(void) {
int day, month, year;
cout << "Enter year month day: ";
string date;
cin >> date;
parseDate(date, year, month, day);
cout << dayOfYear(year, month, day) << endl;
return 0;
}

这应该会给你正确的结果。请更新parseDate,以便在进行标记化之前验证输入字符串。