以一个闰年检测程序为例的非法字符异常输入检测

闰年:闰年(Leap Year)是为了弥补认为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。

简单来说,置润法则是:四年一闰,百年不闰,四百年再闰。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。

例如:1950-2050年间的闰年:

        1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,
        2004,2008,2012,2016,2020,2024,2028,2032,2036,2040,2044,2048.
 
基于高级语言C++,一种基本的检测一个年份是闰年与否的判断语句就是:
 
       if(year%4==0&&year%100!=0)||(year%400==0)
             cout<<"闰年";
 
但我们必须考虑到,在一个闰年检测程序中,用户的输入可能存在多种多样的非法输入。例如:
       1. 输入的年份中包含非法字符,如:2040abc;
       2. 输入的年份为非正整数,如:-2008、0等;
       3. 输入的年份为小数(浮点数),如:2005.6;
       4. 其他错误输入.
 
所以针对以上的各种可能异常,我给出以下测试用例:
 
用户输入: 预计输出: 实际输出:
2008 闰年   闰年
2009 平年   平年
2008abc 非法字符 非法字符
-2008 非法年份       非法年份
2008.5 非法字符 非法字符
 
以下是针对如上测试用例的测试结果截图:
 

           

            

为了检测用户输入中的非法字符,我将用户的输入定义为String类型,并采取逐位检测的方法确认用户的输入是否为合法的正整数年份:

   

    //判断用户的输入是否包含非法字符,如:字母、汉字:
    for(int i=0;i<year.size();i++){
        if ((year.at(i)>'9') || (year.at(i)<'0'))
        {
           cout << "您的输入包含非法字符";
           return   0;
        }
    }

若果用户的输入合法,再将用户的String类型输入换位Int型,进行进一步的判断处理:

    stringstream ss;

    ss << year;

    ss >> number; //获取全部为数字的用户输入

以下是我该检测程序全部代码的截图:


程序中部分难以理解的代码行我都在注释里给出了详细解释,希望能让大家有所收获,欢迎在留言里与我交流。

 
原文地址:https://www.cnblogs.com/tjuwcx/p/4395839.html