我是编程新手,我现在正在学习C ++
我有此代码,例如,如果我输入[5]
,则输出必须为2018 2 32
,但现在输出为0
且我不知道如何解决这个问题。我需要帮助,并想知道是否有人可以查看我的代码并告诉我它有什么问题?
62
它编译但输出不正确。我非常感谢您的帮助和反馈。非常感谢你
答案 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;
}
**原始回复**
您未正确解析输入。您的输入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,以便在进行标记化之前验证输入字符串。