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

闰年:闰年(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; //获取全部为数字的用户输入

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

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

时间: 2024-11-10 11:20:50

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

检测字符串中是否含有非法字符js代码

检测字符串中是否含有非法字符js代码:通常情况下,网站输入的字符串内容是需要经过检测的,因为有些字符带有一定的危险性,会对站点带来一定的危害,下面就介绍一下如何检测一个字符串是否含有非法字符,代码如下: function checks(str){ szMsg="[#_%&'\",;:=!^]"; alertStr=""; for(i=1;i<szMsg.length+1;i++){ if(str.indexOf(szMsg.substring

IDEA导入一个新项目原来没有问题,出现非法字符正解

新导入一个项目,项目代码没有女人和问题 ,在Eclipse上面都能跑的起来,然后导入到IDEA中就不行了 ,出现非法字符 原来就遇到过这样的问题,解决了,没注意过一段时间有忘记了,今天下下啦,给大家提个醒,程序员真到要经常写博客 下面看下出现的问题的截图 原因是没有设置编码格式,到setting里面找到file encoding ,设置一下编码格式 好了,设置完毕后再次运行就没问你啦

结对-结对英文词频检测程序-需求分析

英文词频检测程序 本软件具有以下功能:1.检测一个文档中出现过的所有单词及词频数2.检测一个文档中停用部分词后所有的单词数及词频数3.检测一个文档中和另外一个词表对比之后超纲的词及词频数,本功能可用于英语试卷的智能分析4.检测一个文档中各种词的变化形式,包括复数.不规则.过去分词.现在分词.比较级和最高级5.将词和词频导出为Excel及文本文件6.词典工具具有超强功能:提取某个长度的词.删除首字符串含某字符串的词.提取尾字符串为某字符串的词.删除尾字符含某字符串的词.提取出首字符串为某字符串的词

[软件测试学习]考虑到测试的代码编写/int.parse的非法输入—由一个简单的c#闰年检测程序说起

一个简单的C#的闰年检测程序 1.闰年检测的函数编写 当提起检测平年闰年时候,第一反应写出的代码 1 public static bool isLeapYear(int year){ 2 return ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)) 3 } 但是这个并不易于测试和出现错后的修改,更改代码如下 1 public static bool isLeapYear(int year){ 2 bool check = ne

Python重写C语言程序100例--Part8

''' [程序61] 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: ''' if __name__ == '__main__': a = [] for i in range(10): a.append([]) for j in range(10): a[i].append(0) for i in range(10): a[i][0] = 1 a[i][i] = 1 for i in range(2,10): for j in range(1,i): a[i][j] = a[i

Python重写C语言程序100例--Part5

''' 程序31] 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. 2.程序源代码: ''' from sys import stdin letter = stdin.read(1) stdin.flush() while letter != 'Y': if letter == 'S': print 'please input second letter

Python重写C语言程序100例--Part4

''' [程序24] 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. 1.程序分析:请抓住分子与分母的变化规律. 2.程序源代码: ''' #方法一 a = 2.0 b = 1.0 s = 0 for n in range(1,21): s += a / b t = a a = a + b b = t print s #方法二 s = 0.0 for n in range(1,21): s += a / b b,a = a , a +

Python重写C语言程序100例--Part2

'''题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 情况,闰年且输入月份大于3时需考虑多加一天. 2.程序源代码: ''' year = int(raw_input('year:\n')) month = int(raw_input('month:\n')) day = int(raw_input('day:\n')) months = (0,31,59,90,120,151,181,212,24

Python重写C语言程序100例--Part7

''' [程序51] 题目:学习使用按位与 & . 1.程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 2.程序源代码: ''' if __name__ == '__main__': a = 077 b = a & 3 print 'a & b = %d' % b b &= 7 print 'a & b = %d' % b ''' 题目:学习使用按位或 | . 1.程序分析:0|0=0; 0|1=1; 1|0=1; 1