C ++数据验证问题

时间:2013-09-18 23:24:05

标签: c++

if (month > 0 && month <= 12)
    if (day > 0 && day <= checkDays(month, year))
        if (year >= 1752 || year <= 9999)
            if((month != 12 && day != 31 && year != 9999))
                return true;
            else return false;
        else return false;
    else return false;
else return false;

我的值为month = 12,days = 31,year = 2008,数据验证在最后一部分失败,但我无法弄清楚原因。

3 个答案:

答案 0 :(得分:2)

您的第一年条件在您想要AND时使用OR;你的第二年条件与我怀疑你想要的完全相反。

您还有一个操作订单错误:您无法检查之后验证月份和年份的那一天(假设checkDays提供的最大值是特定(月,年)对的日期编号;如果是,则应将其重命名为days_in_month)。

最后,像这样的代码通常更容易阅读,如果写成一系列if-fail-return-false条件而没有任何嵌套。像这样:

// Year range supported is [1752, 9999].
// (Gregorian calendar introduced in 1752 in Great Britain.)
if (year < 1752 || year > 9999)
  return false;

// Valid month numbers in [1, 12].
if (month < 1 || month > 12)
  return false;

// Valid day numbers in [1, n] where n depends on month and year.
if (day < 1 || day > checkDays(month, year))
  return false;

// 9999-12-31 is invalid (used as a sentinel value?)
if (year == 9999 && month == 12 && day == 31)
  return false;

return true;

顺便说一句,Long Now人会对你的年上限有所了解。

答案 1 :(得分:2)

我发现用“找到虚假的东西并返回”来写这些东西几乎总是更容易。所以:

if (month < 1 || month > 12) return false;
if (day < 1 || day > 31) return false;
if (year < 1752 || year > 9999) return false; 
if (month == 12 && day == 31 && year == 9999) return false;

// If we get here, everything is fine, so return true.
return true; 

当然,你应该根据它是哪个月来检查day

int daysInMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month < 1 || month > 12) return false;  // Must do this before checking day!
int daysThisMonth = daysInMonth[month]; 
// Check for leapyear.
if (month == 2 && year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
{
   daysThisMonth = 29;
}
if (month != 2 && day < 1 || day > daysThisMonth) return false;
...

答案 2 :(得分:1)

有点猜测,因为我不太清楚你的功能应该做什么,但是这里有。

month != 12 && day != 31 && year != 9999仅在月份不是12 时才返回true 年份不是9999。

因此,对于您的输入,它是:

month != 12 && day != 31 && year != 9999
=> false && false && true
=> false

你不想要:

month != 12 || day != 31 || year != 9999

如果月份不是12 ,则该日期不是31 年份不是9999,将返回true。

一种等效的,但可能更容易理解的写作方式:

!(month == 12 && day == 31 && year == 9999)

所以“如果月份是12,第31天和9999年,则返回false”。