今天从一个题目中学到不少东西,打算分享出来和大家探讨一下。
现有题为:编写代码实现,模拟用户登录情景,并且只能登陆三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
首先函数主体先写出来,总体思路先理清,题目说只能登录三次,最多输入三次密码,也就是程序最多循环三次,如果能提前结束的话,提前break跳出即可。
上图为主要循环,此时假设我们要输入的密码是一个字符串"123456",这时给上一个数组password[]。如下图所示:
这里有两个重点要注意一下,其一就是scanf里的password不用&(取地址)的原因是password本身是一个数组名,数组名就是一个地址,因此不用&。
其二,就是这里可能会有人把(char password[20] = "")写成(char password[] = ""),这样是不对的,因为这样创建数组,(char password[] = "")里面的[]没有指定大小,它是根据后面内容来创建的,那么后面的""里面是一个空字符串,空字符串我们知道里面只有一个'\0',那么这个password的数组里面也就只有一个元素'\0',此时如果输入一个密码,比如输入了一个"123456"这样的字符串,或者"abcdef"这样的字符串,里面的空间是不够大的,是放不下的,这样就会形成越界访问,因此当我们不知道(char password[] = "")后面的""里面要初始化什么东西的时候,要考虑到数组的空间大小到底够不够我们使用。
所以上图的一个错误的图例,下图才是一个正确的代码书写方法。
接下来就是下一步的程序了,题目说到密码成功则登录成功,如果密码错误即退出程序,那么此时我们就给到一个 if 的判断语句。
注意上图的代码书写也是有错误的,比较2个字符串是否相等的时候,切记不能使用==,而应该使用strcmp这个函数。如下图
那么主要程序就是如上图所示,当判断password是否和字符串相等,就要看strcmp这个函数是否返回0,是的话即登陆成功,break跳出程序,不是的话密码错误,循环,当循环到第三次的时候,if(i == 3),三次密码都错误的时候,程序退出。
这里就要大概展开strcmp这个函数来讲一讲,它是一个库函数,我们用电脑上的MSDN来查一下,它的全名是:string compare。头函数是<string.h>,所以最终要在主函数前引用这个头文件。
最终程序运行效果如下图所示:
综上就是一个简单的密码输入逻辑,当然在正式的软件开发的时候,密码判断比上面说到的复杂的多了,因为密码不可能就明文写入代码里头的,正常情况来说密码是加密过后放入数据库里头的,里头需要与密码匹配的话还会涉及到加密解密的一个过程,所以上述只是探讨一个简单的逻辑。